我在Lucene指数中有3条记录。
记录1包含标题字段中的医疗保健。 记录2包含描述字段中的医疗保险和保险,但不在一起。 记录3包含公司名称字段中的医疗保险。
当用户搜索医疗保险时,我想在搜索结果中按以下顺序显示记录...
a.Record#3 ---因为它包含输入的两个单词(即一个短语) b。记录#1 c。记录#2
换句话说,所有关键字的完全匹配应该比单个关键字的匹配更重要。
我如何在lucene中实现这一目标?
感谢。
答案 0 :(得分:1)
使用短语+ slop因子重写查询。因此,如果查询是:
healthcare insurance
您可以将其重写为:
"healthcare insurance"~100
将“医疗保健”和“保险”更接近彼此的文件得分更高。在这种情况下,由于slop因子为100,所以同时包含两个单词但超过100个术语的文档将不匹配。
重写查询涉及操纵BooleanQuery
中的Term对象。完成所有条款,创建PhraseQuery
,然后设置一个slop因子。
答案 1 :(得分:1)
你可以使用短语+ slop作为bajafresh4life说,但是如果这些术语超过slop,它将无法匹配。
稍微复杂的替代方法是构造一个布尔查询,明确搜索短语(有或没有slop)和短语中的每个术语。 E.g。
"healthcare insurance" OR healthcare OR insurance
正常的lucene相关性排序将为您提供您想要的,并且不会以“大倾斜”方式的方式失败。
您还可以提升单个字段,例如,标题的加权比描述或公司名称更重要。这需要一个更复杂的查询,但可以让您更好地控制订购......
title:"healthcare insurance"^2 OR title:healthcare^2 OR title:insurance^2
OR description:"healthcare insurance" OR ...
权衡权利可能相当棘手,你可能不得不玩弄它们来得到你想要的东西(例如我刚给出的例子,你可能不想提高标题的个别条款) ,但是当你使它工作时,它非常好: - )