gpt4 book ai didi

solr - solr 多值字段的评分

转载 作者:行者123 更新时间:2023-12-03 14:47:13 25 4
gpt4 key购买 nike

如果我在 Solr 中有一个包含多值字段的文档,是多个值是独立评分的还是只是串联并评分为一个大字段?我希望他们是独立得分的。这是我的意思的一个例子:

我有一个包含一个人名字段的文档,其中同一个人可能有多个名字。名称都不同(在某些情况下非常不同),但它们都是同一个人/文件。

第 1 个人:
大卫·鲍伊、大卫·罗伯特·琼斯、Ziggy Stardust、瘦白公爵

人 2:
大卫莱特曼

第 3 个人:
大卫·哈塞尔霍夫,大卫·迈克尔·哈塞尔霍夫

如果我要搜索“David”,我希望所有这些都有相同的匹配机会。如果每个名字都是独立评分的,情况似乎就是这样。如果它们只是作为单个字段存储和搜索,David Bowie 将因拥有比其他 token 多得多的 token 而受到惩罚。 Solr 如何处理这种情况?

最佳答案

您可以运行您的查询 q=field_name:DaviddebugQuery=on看看会发生什么。

这些是按 fl=*,score 排序的结果(包括通过 score desc 的分数) :

<doc>
<float name="score">0.4451987</float>
<str name="id">2</str>
<arr name="text_ws">
<str>David Letterman</str>
</arr>
</doc>
<doc>
<float name="score">0.44072422</float>
<str name="id">3</str>
<arr name="text_ws">
<str>David Hasselhoff</str>
<str>David Michael Hasselhoff</str>
</arr>
</doc>
<doc>
<float name="score">0.314803</float>
<str name="id">1</str>
<arr name="text_ws">
<str>David Bowie</str>
<str>David Robert Jones</str>
<str>Ziggy Stardust</str>
<str>Thin White Duke</str>
</arr>
</doc>

这是解释:
<lst name="explain">
<str name="2">
0.4451987 = (MATCH) fieldWeight(text_ws:David in 1), product of: 1.0 = tf(termFreq(text_ws:David)=1) 0.71231794 = idf(docFreq=3, maxDocs=3) 0.625 = fieldNorm(field=text_ws, doc=1)
</str>
<str name="3">
0.44072422 = (MATCH) fieldWeight(text_ws:David in 2), product of: 1.4142135 = tf(termFreq(text_ws:David)=2) 0.71231794 = idf(docFreq=3, maxDocs=3) 0.4375 = fieldNorm(field=text_ws, doc=2)
</str>
<str name="1">
0.314803 = (MATCH) fieldWeight(text_ws:David in 0), product of: 1.4142135 = tf(termFreq(text_ws:David)=2) 0.71231794 = idf(docFreq=3, maxDocs=3) 0.3125 = fieldNorm(field=text_ws, doc=0)
</str>
</lst>

这里的评分因素是:
  • termFreq :一个词在文档中出现的频率
  • 以色列国防军 :该词在索引中出现的频率
  • fieldNorm :术语的重要性,取决于索引时间提升和字段长度

  • 在您的示例中 fieldNorm有所作为。您有一个文档的下级 termFreq (1 而不是 1.4142135)因为该术语只出现一次,但由于字段长度,该匹配更为重要。

    您的字段是 multiValued 的事实不会改变评分。我想它与具有相同内容的单个值字段相同。 Solr 在字段长度和术语方面起作用,因此,是的,David Bowie 因拥有比其他 token 多得多的 token 而受到惩罚。 :)

    更新
    我实际上认为大卫鲍伊值得他的机会。如上所述, fieldNorm有所作为。添加属性 omitNorms=true给您的 text_ws schema.xml 中的字段并重新索引。相同的查询将为您提供以下结果:
    <doc>
    <float name="score">1.0073696</float>
    <str name="id">1</str>
    <arr name="text">
    <str>David Bowie</str>
    <str>David Robert Jones</str>
    <str>Ziggy Stardust</str>
    <str>Thin White Duke</str>
    </arr>
    </doc>
    <doc>
    <float name="score">1.0073696</float>
    <str name="id">3</str>
    <arr name="text">
    <str>David Hasselhoff</str>
    <str>David Michael Hasselhoff</str>
    </arr>
    </doc>
    <doc>
    <float name="score">0.71231794</float>
    <str name="id">2</str>
    <arr name="text">
    <str>David Letterman</str>
    </arr>
    </doc>

    正如您现在看到的 termFreq胜和 fieldNorm根本不考虑。这就是为什么尽管长度不同,但出现两次 David 的两个文档都在最上面并且分数相同,而只有一个匹配项的较短文档是最后一个分数最低的文档。这是 debugQuery=on的解释:
    <lst name="explain">
    <str name="1">
    1.0073696 = (MATCH) fieldWeight(text:David in 0), product of: 1.4142135 = tf(termFreq(text:David)=2) 0.71231794 = idf(docFreq=3, maxDocs=3) 1.0 = fieldNorm(field=text, doc=0)
    </str>
    <str name="3">
    1.0073696 = (MATCH) fieldWeight(text:David in 2), product of: 1.4142135 = tf(termFreq(text:David)=2) 0.71231794 = idf(docFreq=3, maxDocs=3) 1.0 = fieldNorm(field=text, doc=2)
    </str>
    <str name="2">
    0.71231794 = (MATCH) fieldWeight(text:David in 1), product of: 1.0 = tf(termFreq(text:David)=1) 0.71231794 = idf(docFreq=3, maxDocs=3) 1.0 = fieldNorm(field=text, doc=1)
    </str>
    </lst>

    关于solr - solr 多值字段的评分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9261524/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com