Solr得分未按匹配百分比

时间:2016-10-13 21:57:00

标签: solr

我使用solr搜索名称列表并使用ngrams来计算部分字符串匹配。如果我有“玫瑰”,“罗森”,“罗森伯格”和“罗森塔尔”的名字,我希望回复“玫瑰”的查询:

Rose
Rosen
Rosenberg
Rosenthal

但我得到的是:

Rosenberg
Rosenthal
Rose
Rosen

所有结果都具有相同的分数。我曾尝试创建一个完全匹配字段和一个ngrams字段,但这不会给我什么。当我搜索“玫瑰”时,我得到:

Rose
Rosenberg
Rosenthal
Rosen

只有精确匹配得分更高,所有其他匹配仍然相同,无论匹配百分比如何。如果我想按匹配百分比排序结果,其次按字母顺序排序,我该怎么做?

2 个答案:

答案 0 :(得分:1)

您没有看到更改的原因是因为它们都匹配相同的令牌,并且分数是根据索引中的令牌计算的。

令牌是"表格"对于单词,ngram过滤器将从单词生成多个标记,例如rorosrose。由于所有单词都匹配相同的标记rose,因此它们得分相同。

解决这个问题的方法是有两个字段 - 一个用于完全匹配,一个用于ngram字段,然后在qf中对这些字段进行不同的权衡(如果使用(e)dismax)。这样一个确切的命中将对分数贡献更多。

您的第一个示例将通过按字母排序顺序排序来实现(因为所有单词都具有相同的前缀,可能是您想要的)。

如果要按令牌长度排序(如果这是一个具有单个值的字段),Solr中没有函数可以检索此刻索引值的实际长度,因此您必须将一个值与包含索引内容长度的字段一起索引,然后按此排序 - 这样您就可以先获得较短的匹配。

例如,如果您的字段为name,则可以将字段name_length添加为整数,然后在执行添加时将此字段添加到文档中:

document.addField("name", name);
document.addField("name_length", name.length()); // or len(name) in python, etc.

具体如何做到这一点取决于您如何为内容编制索引。您也可以在Solr的更新链中执行此操作,例如在StatelessScriptUpdateProcessor中使用Javascript。手动方法可能更快更容易实现,但无论索引操作来自何处,都可以使用更新链(因此,如果您从许多位置/代码库进行索引等,它可能会有用)评估)。

答案 1 :(得分:0)

解决此问题的一种方法是拥有两个字段-一个用于完全匹配,一个用于ngram字段,然后在qf中对这些字段进行不同的加权(如果使用(e)dismax)。这样一来,准确的匹配将对得分有更大贡献。

如果我对ngram使用相同的字段,则可以使用