Lucene查询" OR"和" IN"

时间:2015-12-22 18:47:43

标签: lucene lucene.net

我在我的项目中使用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);

我也查看了类似问题的其他解决方案,例如how to properly escape OR and AND in lucene query?,但我没有运气将这些解决方案应用于此问题。我使用的是Lucene.NET 3.0.3。

1 个答案:

答案 0 :(得分:1)

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

问题在于标准分析消除了某些称为停用词的常用词,这些词被认为通常不是有趣的搜索词。默认情况下,停用词是常用英语单词,包括" in","或"和"和"等等(完整列表: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
);