2011-10-12 2 views
3

У меня есть поле, которое я индексацией с 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 каждый раз.

Любые советы будут оценены. Благодаря!

ответ

2

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

MultiFieldQueryParser parser = new MultiFieldQueryParser(Version.LUCENE_30, getSearchFields(), 
      new KeywordAnalyzer(Version.LUCENE_30)); 

Вы можете использовать PerFieldAnalyzerWrapper если ваши другие поля не являются ключевыми словами.

+0

PerFieldAnalyzerWrapper - это именно то, что мне нужно, поскольку StandardAnalyzer отлично подходит для всех моих других полей. – schmimd04

 Смежные вопросы

  • Нет связанных вопросов^_^