我为我的产品实体定义了一个文档对象,它有几个字段:标题、品牌、类别、大小、颜色、材料。
现在,我想支持用户在多个字段上执行和搜索。任何包含一个、两个或多个字段的文档都将响应所有搜索单词。
例如,当用户输入"gucci恤红色“时,我希望返回与所有3个标记"gucci”、“恤”和“红色”匹配的所有文档。因此,以下所有文件将得到答复:
1.带有标题的文件包含所有三个字,例如标题= "Gucci现代衬衫红色“或"Gucci蓝色衬衫”.
2.标题=“古驰经典衬衫”和颜色=“红色”的文件
3.类别=“男衬衫”及“品牌”=“古驰”及“颜色=红色”的文件
4.等
我知道Lucene支持操作符+用于搜索查询。例如,我可以将上面的关键字翻译成查询"+gucci +恤+red“,然后我确信上面示例(1)的文档一定会得到响应。但对上述(2)和(3)类情况是否有效?
发布于 2013-10-07 17:01:57
不,如果没有在查询中指定要显式搜索的字段,它将转到默认字段,在您的情况下,该字段将显示为"title“。您需要一个更像这样的查询:
+shirt +color:red +brand:gucci
例如。
或者,一个常见的用法是设置一个catch all字段,在该字段中,所有(或大部分)可搜索数据被混合在一起,允许您以非常松散的方式搜索该字段上的所有内容,在这种情况下,您只需使用以下内容:
all:(+shirt +gucci +red)
或者,如果将该字段改为默认字段:
+shirt +gucci +red
就像你说的。
发布于 2013-10-08 18:33:07
当执行这些类型的查询时,我喜欢:创建一个主BooleanQuery,并添加几个子查询,这些子查询一起工作,以获得最好的结果。
我将或所有这些类型,然后过滤出来,使用收集器最低得分。
我喜欢主BooleanQuery方法的原因是您可以设置用户选择查询的“类型”。可能是因为简单的->先进,而且很容易快速地添加/删除查询类型,并且可以很容易地构建查询,并给出预测结果。提高记录/相似性,您正在内部Lucene算法和结果有时不清楚。
Performance: --我使用Lucene3.0.x在内存中记录超过100 m的索引上进行了类似的查询,它的工作速度很快,给出了次秒响应。模糊查询确实会减慢速度,但如前所述,可以将其转换为高级搜索选项(或“使用.重新搜索”)。
发布于 2013-10-08 11:40:53
你可以用MultiFieldQueryParser。添加标题,颜色,品牌等。
如果您搜索"gucci恤红色“,那么使用上面的Parser将返回如下查询
+(标题:gucci颜色:gucci品牌:gucci)(标题:衬衫颜色:衬衫品牌:衬衫)(标题:红色:红色品牌:红色)
这应该能解决这个问题。
另外,如果你想要,比如说,对于上面的查询,你想用gucci产品来显示品牌,然后你可以应用到这个领域。
https://stackoverflow.com/questions/19230403
复制相似问题