У меня есть поле, которое я индексацией с Lucene, как так:Lucene Analyzer для индексации и поиска
@Field(name="hungerState", index=Index.TOKENIZED, store=Store.YES)
public HungerState getHungerState() {
Возможные значения этого поля HUNGRY, SLIGHTLY_HUNGRY, and NOT_HUNGRY
Когда эти значения индексируются с использованием StandardAnalyzer
, термины заканчиваются как hungry, slightly
, так как он символизирует пунктуацию и игнорирует «нет».
Если я изменю индекс на index=Index.UN_TOKENIZED
, индексированные термины равны HUNGRY, SLIGHTLY_HUNGRY, and NOT_HUNGRY
, как и ожидалось.
Мой поиск API имеет 1 «поиск» метод, который строит Query
так:
MultiFieldQueryParser parser = new MultiFieldQueryParser(Version.LUCENE_30, getSearchFields(), new StandardAnalyzer(Version.LUCENE_30));
parser.setDefaultOperater(QueryParser.AND_OPERATOR);
Query query = parser.parse(searchTerms);
Это обрабатывает запросы, где searchTerms = «Foo», который ищет все поля, возвращаемые getSearchFields()
на «Foo», и также где searchTerms указывает поля и значения для поиска (то есть «hungerState: HUNGRY»)
Моя проблема связана с последним сценарием. Поскольку синтаксический анализатор запросов использует StandardAnalyzer, поиск hungerState:SLIGHTLY_HUNGRY
анализируется на hungerState:"slightly hungry"
и выполняет поиск hungerState=NOT_HUNGRY
, который обрабатывается в hungerState=hungry
.
Когда поле индексируется с использованием StandardAnalyzer, я получаю неожиданные результаты (поиск результатов возврата HUNGRY и NOT_HUNGRY для всех 3 значений). Когда поле индексируется как UN_TOKENIZED, я не получаю никаких результатов, поскольку анализатор запросов токенизирует строку поиска и делает ее строчной.
Я даже попробовал указать анализатор для индексирования, как KeywordAnalyzer
, но он практически не влияет, поскольку вся строка поиска анализируется StandardAnalyzer
каждый раз.
Любые советы будут оценены. Благодаря!
PerFieldAnalyzerWrapper - это именно то, что мне нужно, поскольку StandardAnalyzer отлично подходит для всех моих других полей. – schmimd04