【问题标题】:Solr score is not ordering results by match percentSolr 分数不是按匹配百分比排序结果
【发布时间】:2016-10-13 21:57:00
【问题描述】:

我正在使用 solr 搜索名称列表并使用 ngrams 来解决部分字符串匹配问题。如果我有名称“Rose”、“Rosen”、“Rosenberg”和“Rosenthal”,我希望返回“Rose”查询:

Rose
Rosen
Rosenberg
Rosenthal

但我得到的是:

Rosenberg
Rosenthal
Rose
Rosen

所有结果都具有相同的分数。我试过创建一个完全匹配字段和一个 ngrams 字段,但这也没有给我我的东西。当我搜索“玫瑰”时,我得到:

Rose
Rosenberg
Rosenthal
Rosen

只有完全匹配的分数更高,而所有其他匹配仍然相同,无论匹配百分比如何。如果我想按匹配百分比对结果进行排序,然后按字母顺序排序,我该怎么做?

【问题讨论】:

    标签: solr


    【解决方案1】:

    您看不到变化的原因是它们都匹配相同的标记,并且根据索引中的标记计算分数。

    一个token是单词的一种“形式”,ngram过滤器会从一个单词中生成多个token,例如rorosrose。由于所有单词都匹配相同的标记rose,因此它们得到相同的分数。

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

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

    如果你想按标记长度排序(如果这是一个具有单个值的字段),Solr 中没有函数来检索索引值的实际长度,所以你必须索引一个value 与包含索引内容长度的字段一起,然后也按此排序 - 这样您将首先获得较短的匹配项。

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

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

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

    【讨论】:

    • 我喜欢按令牌长度排序的想法。我将如何准确地索引索引内容的值?
    • @user3688241 我在答案中添加了一个示例。
    【解决方案2】:

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

    如果我对 ngram 使用相同的字段,它会起作用

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-26
      • 1970-01-01
      • 2015-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-05
      相关资源
      最近更新 更多