我为我的产品实体定义了一个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)?
答案 0 :(得分:5)
在进行这些类型的查询时,我喜欢: 创建一个主BooleanQuery并添加多个子查询,它们协同工作以提供最佳结果 :
我会对所有这些类型进行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然后你可以应用提升到这个领域。