Использование MultiFieldQueryParser - PullRequest
1 голос
/ 17 марта 2009

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

Спасибо.

Ответы [ 3 ]

2 голосов
/ 17 марта 2009

Я не уверен, что MultiFieldQueryParser делает то, что вы думаете, что он делает. Кроме того ... Я не уверен, что знаю, что ты пытаешься сделать.

Я знаю, что в любом парсере запросов такие строки, как 'a.a.' и "b.b." будут удаляться периоды, потому что, по крайней мере, с анализатором по умолчанию, все знаки препинания рассматриваются как пробелы.

Что касается MultiFieldQueryParser, это всего лишь QueryParser, который позволяет указывать несколько полей по умолчанию для поиска. Так и с запросом

title: "Мыши и мужчины" "Джон Стейнбек"

Строка "John Steinbeck" будет искать во всех ваших полях по умолчанию, тогда как "Of Mice and Men" будет искать только в поле заголовка.

1 голос
/ 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 голос
/ 17 марта 2009

Какой анализатор использует ваш парсер? Если это StopAnalyzer, то точка может быть словом остановки и поэтому игнорируется. То же самое, если это StandardAnalyzer, который очищает ввод (включая удаление точек).

...