2015-12-22 7 views
0

Я использую Lucene.net в своем проекте для поиска клиентов. У меня есть индекс Lucene, и поиск возвращает ожидаемые результаты для всех моих проиндексированных полей, однако, когда я ищу специально для клиентов в Индиане или Орегоне, я получаю нулевые результаты, несмотря на то, что моя база данных отражается иначе.Lucene Query для «OR» и «IN»

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

Пример:

State:(fl) returns results for customers in Florida, as expected. 
State:(in) returns no results 
State:(or) returns no results 
State:(ar*) returns results for customers in Arkansas, as expected. 
State:(in*) returns no results 
State:(or*) returns no results 
State:("mi") returns results for customers in Michigan, as expected. 
State:("or") returns no results 
State:("in") returns no results 
State:("\\ca") returns results for customers in California, as expected. 
State:("\\or") returns no results 
State:("\\in") returns no results 

На соответствующую записку, в поисках имен, содержащих AND, OR, и в работе без выпуска:

Name:(and*) returns results for Andrew, Andrea, Andy, etc. 
Name:(in*) returns results for Inge, Ina, Indie, etc. 
Name:(or*) returns results for Oris, Orlando, Orville, etc. 

Я попытался следующие для создания своих индексов:

new Field("State", (String.IsNullOrWhiteSpace(ShippingState) ? "" : ShippingState), Field.Store.YES, Field.Index.ANALYZED); 

new Field("State", (String.IsNullOrWhiteSpace(BillingState) ? "" : BillingState), Field.Store.YES, Field.Index.ANALYZED); 

new Field("State", (String.IsNullOrWhiteSpace(ShippingState) ? "" : ShippingState) + " " + (String.IsNullOrWhiteSpace(BillingState) ? "" : BillingState), Field.Store.YES, Field.Index.ANALYZED); 

Я также рассмотрел другие решения подобных проблем, такие как how to properly escape OR and AND in lucene query?, но мне не повезло в адаптации этих решений к этой проблеме. Я использую Lucene.NET 3.0.3.

ответ

1

Проблема здесь не в коллизии с синтаксисом запроса. «IN» - это даже не ключевое слово запроса lucene.

Проблема заключается в том, что стандартный анализ устраняет некоторые общие слова, известные как стоп-слова, которые, как правило, не являются интересными поисковыми терминами. По умолчанию это слова остановки являются обычными английскими словами, в том числе «в», «или» и «и», среди прочих (полный список здесь: What is the default list of stopwords used in Lucene's StopFilter?).

Если это не желательное поведение в вашем случае, вы можете определить ваш StandardAnalyzer с обычаем (или пустыми) стоп-слов установить:

StandardAnalyzer analyzer = new StandardAnalyzer(
    Lucene.Net.Util.Version.LUCENE_30, 
    new HashSet<String>() //Empty stop word set 
); 
+0

Спасибо за вашу помощь, femtoRgon. Я внесу изменения в свой код. – mckennawebdev