Точная фраза со специальными символами в Lucene.net - PullRequest
0 голосов
/ 10 августа 2011

У меня проблема с полнотекстовым поиском в lucene.net, где результат поиска содержит специальные символы lucene.

В моих документах Lucene есть поле с именем "content".Это поле создается следующим образом и содержит содержимое проиндексированных документов:

document.Add(new Field("content", fulltext, Field.Store.YES, Field.Index.ANALYZED));

Для создания индекса я использую Standardanalyzer.

Для запроса индекса я используюследующий код:

var queryParser = new QueryParser(Lucene.Net.Util.Version.LUCENE_29, "content", analayzer);
queryParser.SetAllowLeadingWildcard(true);
queryParser.SetMultiTermRewriteMethod(MultiTermQuery.SCORING_BOOLEAN_QUERY_REWRITE);
Query fullTextQuery = queryParser.Parse(queryString);

Затем запрос добавляется в BooleanQuery, который используется для получения результатов из IndexSearcher.Я думаю, что остальная часть кода не так важна, потому что код работает так, как это должно быть для 99% запросов.Я также использую StandardAnalyzer для запроса индекса.

Теперь здесь проблема.Иногда поле «содержимое» документа содержит текст, который разделяется с помощью «-»

некоторый текст, некоторый текст, селектор, рычаг, другой текст, некоторый текст

Теперь, когда яделаю полнотекстовый поиск (точная фраза) с помощью «селекторного рычага».Запрос выглядит следующим образом:

content: "рычаг селектора"

Проблема здесь в том, что также найден документ, содержащий вышеуказанный текст, хотя он не долженбыть найдены, потому что 2 слова разделены, используя "-" и не пусто.

Я думаю, что это как-то связано с анализатором и фактом, что "-" является специальным символом в lucene.

Может быть, кто-то может помочь мне решить эту проблему.

заранее спасибо Martin

1 Ответ

0 голосов
/ 20 августа 2011

Вы правы, полагая, что проблема в том, что анализатор используется во время индексации.

Из Lucene Javadocs :

Грамматикаоснованный на JKlex токенайзер

Это должно быть хорошим токенизатором для большинства документов на европейском языке:

  • Разбивает слова на знаки препинания, удаляя знаки препинания.Однако точка, за которой не следует пробел, считается частью токена.
  • Разбивает слова в дефисах, если в токене нет числа, и в этом случае весь токен интерпретируется как номер продуктаи не разделяется .
  • Распознает адреса электронной почты и имена хостов в Интернете как один токен.

У многих приложений есть определенные потребности в токенизаторе.Если этот токенизатор не подходит для вашего приложения, рассмотрите возможность копирования этой директории исходного кода в свой проект и ведения своего собственного основанного на грамматике токенизатора.

Поэтому в вашем случае вам нужно будет проиндексировать ваши документы с помощьюболее строгий анализатор, такой как WhitespaceAnalyzer, который разбивается только на пробелы.

...