我在Lucene索引中有3条记录。
记录%1在标题字段中包含医疗保健。记录2在描述字段中包含医疗保健和保险,但不在一起。记录3在公司名称字段中包含医疗保险。
当用户搜索医疗保险时,我希望在搜索结果中按以下顺序显示记录...
词组#3-因为它包含输入的两个单词在一起(ie.as a a.Record ) b.Record #1 c.Record #2
换句话说,所有关键字的精确匹配应该比单个关键字的匹配具有更大的权重。
我如何在lucene中实现这一点?
谢谢。
发布于 2009-10-07 05:31:26
你可以像bajafresh4life说的那样使用phrase + slop,但是如果词条之间的距离超过了slop,它将无法匹配任何东西。
一种稍微复杂一点的替代方法是构造一个布尔查询,该查询显式地搜索短语(带或不带slop)和短语中的每个术语。例如。
"healthcare insurance" OR healthcare OR insurance普通的lucene相关性排序将给你想要的东西,并且不会像“大斜率”方法那样失败。
您还可以提高单个字段的权重,例如,title的权重比description或company name更重。这需要一个更复杂的查询,但让您可以更好地控制排序……
title:"healthcare insurance"^2 OR title:healthcare^2 OR title:insurance^2
OR description:"healthcare insurance" OR ...获得正确的权重可能是相当棘手的,你可能不得不尝试它们来获得你想要的东西(例如,在我刚刚给出的例子中,你可能不想提升标题的单个术语),但当你让它工作时,这是非常好的:-)
发布于 2009-10-01 14:43:03
使用短语+斜率因子重写查询。因此,如果查询是:
healthcare insurance您可以将其重写为:
"healthcare insurance"~100“医疗保健”和“保险”这两个词接近的文档得分会更高。在这种情况下,由于斜率因子为100,因此具有两个单词但相距超过100个术语的文档将不匹配。
重写查询涉及操作BooleanQuery中的术语对象。获取所有术语,创建一个PhraseQuery,并设置一个斜率因子。
https://stackoverflow.com/questions/1500762
复制相似问题