(Повторяю мой ответ от Дупе . Один из них должен быть удален).
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." в тексте.