Java Lucene как организовать поиск по точному соответствию?
например у меня есть такой текст:
"String content = "book data weaponry is IS iS Is Nato war force ENTREPRENEUR ENTREPRENEUR";"
И внутри него я хочу найти шаблон "IS", т.е чтобы при поиске у меня был результат только "IS".
Но загвоздка в том, что при создании поля для этого контента я использую new StandardAnalyzer() Как я понял он выполняет разные функции, но она из них это перевести слова в нижний регистр. И шаблон он тоже переводит в нижний регистр.
Получается если я хочу найти "IS", то на деле я ищу "is" в таком индексе:
book data weaponry is is is is nato war force entreprenuer entreprenuer
И в результате я найду 4 слова, это "is is is is".
Какой результат ожидается: есть шаблон "IS", я ищу его в индексе и нахожу не 4 результатных слов, а лишь одно слово, которое наиболее подходит к этому.
Подскажите как можно добиться такого результата? Пока что я могу искать слова без учета регистра. Может быть надо что-то другое использовать, напишите пожалуйста.
Ответы (1 шт):
Analyzer используется для двух вещей:
- при индексации. Он нормализует и преобразовывает данные, в частности, может для текста
ISвставить в индекс иISиis. - при поиске. В этом случае он нормализует и преобразовывает строку поиска перед тем как, собственно, будет делаться поиск.
Если вы используете StandardAnalyzer при индексации и при поиске, то у вас происходит преобразование данных и поискового слова в нижний регистр, и поиск получается регистронезависимым. Если нужен поиск текста в том регистре, в котором он был изначально, то нельзя использовать StandardAnalyzer.
Нужно создать свои анализаторы. Для индексации, такой, который будет сохранять оригинал и текст в нижнем регистре. Для поиска, такой, который не преобразовывает поисковую строку (можно унаследовать от StandardAnalyzer и убрать из него LowerCaseFilter). Тогда при индексации в индекс попадет два варианта. При поиске можно будет выбрать анализатор в зависимости от того, нужен ли регистронезависимый поиск.