Lucene 查询"OR"和"IN"



我在项目中使用Lucene.net来搜索客户。我已经建立了我的Lucene索引,搜索正在返回我所有索引字段的预期结果,然而,当我专门搜索印第安纳州或俄勒冈州的客户时,我收到的结果为零,尽管我的数据库反映了其他情况。

在我的测试用例中,在lucene索引中,这些状态分别缩写为In和OR。搜索其他字段会为这些州的客户产生结果,所以我知道它们是索引的。

示例:

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和IN的名称不会出现问题:

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);

我还研究了类似问题的其他解决方案,例如如何在lucene查询中正确地转义OR和and?但我没能把这些解决方案适应这个问题。我使用的是Lucene.NET 3.0.3。

这里的问题实际上不是与查询语法的冲突。"IN"甚至不是lucene查询关键字。

问题是,标准分析消除了某些被称为停止词的常见词,这些词通常被认为不是有趣的搜索词。默认情况下,停止词是常见的英语单词,包括"in"、"or"one_answers"and"等(此处列出完整列表:Lucene的StopFilter中使用的停止词的默认列表是什么?)。

如果这在您的情况下不是理想的行为,您可以使用自定义(或空)停止字集定义StandardAnalyzer:

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

最新更新