MultiFieldQueryParser удаляет точки из аббревиатуры - PullRequest
0 голосов
/ 19 марта 2009

Я снова отправляю этот вопрос, так как на мой запрос нет ответа.

Я работаю над API поиска книг, используя Lucene. Пользователь может искать книгу, название или поле описания которой содержит C.F.A ... Я использую StandardAnalyzer вместе со списком стоп-слов.

Я использую MultiFieldQueryParser для парсинга выше строки. Но после парсинга он удаляет точки в строке. Что мне здесь не хватает?

Спасибо.

Ответы [ 2 ]

7 голосов
/ 19 марта 2009

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

StandardAnalyzer специально обрабатывает аббревиатуры и преобразует C.F.A. (например) в cfa. Это означает, что вы должны иметь возможность выполнять поиск при условии, что вы используете один и тот же анализатор для индексации и анализа запроса.

Я бы посоветовал вам выполнить еще несколько базовых тестовых случаев, чтобы устранить другие факторы. Попробуйте использовать обычный QueryParser вместо многопольного.

Вот код, который я написал для игры с StandardAnalyzer:

StringReader testReader = new StringReader("C.F.A. C.F.A word");
StandardAnalyzer analyzer = new StandardAnalyzer();
TokenStream tokenStream = analyzer.tokenStream("title", testReader);
System.out.println(tokenStream.next());
System.out.println(tokenStream.next());
System.out.println(tokenStream.next());

Выход для этого, кстати, был:

(cfa,0,6,type=<ACRONYM>)
(c.f.a,7,12,type=<HOST>)
(word,13,17,type=<ALPHANUM>)

Обратите внимание, например, что если аббревиатура не заканчивается точкой, то анализатор предполагает, что это имя интернет-хоста, поэтому поиск "C.F.A" не будет совпадать с "C.F.A." в тексте.

1 голос
/ 19 марта 2009

(я знаком только с java lucene, но думаю, что в данном случае это не имеет значения.)

Цель анализаторов - убрать символы и форматирование, которые мешают эффективному полнотекстовому поиску. Например, если вы напишите документ, в котором вы будете называть lucene только «lucene.net», вы, вероятно, захотите, чтобы lucene также возвращал результаты поиска только для «lucene». Поэтому StandardAnalyzer удаляет точки (а также некоторые другие специальные символы).

Не волнуйтесь, хотя. Как всегда в lucene, это можно настроить, выбрав другой анализатор. Попробуйте использовать SimpleAnalyzer или KeywordAnalyzer вместо этого, и посмотрите, какой из них наиболее близок к вашему желаемому поведению. Если ни один из них не подойдет, вы даже можете реализовать свой собственный анализатор, используя интерфейс анализатора. Это на самом деле довольно просто.

Удачи. :)

...