"OR" 和 "IN" 的 Lucene 查询

Lucene Query for "OR" and "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);

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

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

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