Lucene.NET - 在多个字段上执行AND搜索多个单词

时间:2013-10-07 16:52:53

标签: lucene lucene.net

我为我的产品实体定义了一个Document对象,它有几个字段:Title,Brand,Category,Size,Color,Material。

现在我想支持用户在多个字段上进行AND搜索。任何包含一个,两个或多个字段的文档都将包含所有搜索字词。

例如,当用户输入“gucci shirt red”时,我想返回所有具有与所有3个代币“gucci”,“shirt”和“red”相匹配的字段的文档。因此,以下所有文件都将得到回复:

1.标题文件包含所有3个单词,例如Title =“Gucci Modern Shirt Red”或“Gucci blue shirt”......

2.标题=“古驰经典衬衫”和颜色=“红色”的文件

3.分类=“男士衬衫”的文件和品牌=“gucci”和颜色=“红色”

4.etc ..

我知道Lucene支持运营商+必须进行搜索查询。例如,我可以将上面的关键字翻译成“+ gucci + shirt + red”,然后我确定上面例子(1)的文件一定会被回复。但它是否适用于上述案例(2)和(3)?

3 个答案:

答案 0 :(得分:5)

在进行这些类型的查询时,我喜欢: 创建一个主BooleanQuery并添加多个子查询,它们协同工作以提供最佳结果

  • TermQuery:(完全匹配),有人输入标题的完全匹配
  • PhraseQuery:(使用slop),所以如果你有“Gucci Modern Shirt Red”和某人输入“Gucci Shirt”(注意一个单词的差距)就会匹配
  • FuzzyQuery:(在大型(> 5000万条记录)/非内存索引上速度慢)以解决潜在的拼写错误
  • 布尔子查询:,所有术语分开并进行“或”运算。查询匹配1个我们的4个单词将得分较低,但3/4个单词将得分较高。
  • 查询解析(如上所述,潜在字段提升)
  • 其他:即同义词搜索短语等

我会对所有这些类型进行OR,然后使用收集器最低分数过滤掉它们。

我喜欢master Boolean方法的原因是你可以设置一个用户选择查询“类型”的设置。也许很简单 - >高级,很容易在运行中快速添加/删除查询类型,并且可以非常轻松地构建查询,从而提供预测结果。提升您在内部Lucene算法中的记录/相似性,结果有时不清楚。

效果:我使用Lucene 3.0.x对索引进行了类似的查询> 100M记录NOT IN MEMORY,它可以很快地给出亚秒响应。模糊查询确实减慢了速度,但如前所述,可以将其设置为高级搜索选项(或“再次搜索...”)

答案 1 :(得分:3)

不,如果没有在查询中显式搜索字段,它将转到默认字段,在您的情况下它将显示为“标题”。您需要更多的查询:

+shirt +color:red +brand:gucci
例如

或者,一个常见的用法是设置一个catch all字段,其中所有(或大部分)可搜索数据被混合在一起,允许您以非常宽松的方式在该字段上搜索所有内容,其中你会使用类似的东西:

all:(+shirt +gucci +red)

或者,如果您将该字段设为默认字段:

+shirt +gucci +red

如你所说。

答案 2 :(得分:1)

您可以使用MultiFieldQueryParser。添加标题,颜色,品牌等。

如果您搜索“gucci shirt red”,那么使用上面的Parser将返回

之类的查询

+((标题:gucci颜色:gucci品牌:gucci)(标题:衬衫颜色:衬衫品牌:衬衫)(标题:红色颜色:红色品牌:红色)

这应该可以解决问题。

此外,如果你想要,那么,对于上面的查询,你想要展示品牌与gucci产品显示1然后你可以应用提升到这个领域。