【问题标题】:Calculation of QF and BF in Solr EdimaxSolr Edimax 中 QF 和 BF 的计算
【发布时间】:2023-03-25 22:39:01
【问题描述】:

我正在尝试同时使用 qf 和 bf 字段,但是我无法理解分数的结果。请问分数是怎么计算的?

以下是我提出的查询: http://localhost:8983/solr/corename/select?bf=likes^0.8%20created_time^0.8&debugQuery=on&defType=edismax&indent=on&q=Samsung&qf=description^0.8&wt=json

还有我得到的分数

"rawquerystring":"Samsung"

"querystring":"Samsung"

"parsedquery":"(+DisjunctionMaxQuery(((description:samsung)^0.8)) FunctionQuery(date(created_time))^0.8 FunctionQuery(int(likes))^0.8)/no_coord"
"parsedquery_toString":"+((description:samsung)^0.8) (date(created_time))^0.8 (int(likes))^0.8"

"explain":{
  "23379598044_10154409629363045":"\n1.19288942E12 = sum of:\n  4.6113086 = weight(description:samsung in 61828) [SchemaSimilarity], result of:\n    4.6113086 = score(doc=61828,freq=1.0 = termFreq=1.0\n), product of:\n      0.8 = boost\n      4.2966447 = idf(docFreq=780, docCount=57329)\n      1.3415436 = tfNorm, computed from:\n        1.0 = termFreq=1.0\n        1.2 = parameter k1\n        0.75 = parameter b\n        13.833522 = avgFieldLength\n        5.2244897 = fieldLength\n  1.19288942E12 = FunctionQuery(date(created_time)), product of:\n    1.49111177E12 = date(created_time)=2017-04-02T05:43:00Z\n    0.8 = boost\n    1.0 = queryNorm\n  22.4 = FunctionQuery(int(likes)), product of:\n    28.0 = int(likes)=28\n    0.8 = boost\n    1.0 = queryNorm\n",

【问题讨论】:

    标签: solr


    【解决方案1】:

    好的,让我们破译它 - 首先要做的事情是,将您的解释转换为更易读的东西总是更容易,例如将\n 替换为真正的回车符,如下所示:

    1.19288942E12 = sum of:
      4.6113086 = weight(description:samsung in 61828) [SchemaSimilarity], result of:
        4.6113086 = score(doc=61828,freq=1.0 = termFreq=1.0), product of:
          0.8 = boost
          4.2966447 = idf(docFreq=780, docCount=57329)
          1.3415436 = tfNorm, computed from:
            1.0 = termFreq=1.0
            1.2 = parameter k1
            0.75 = parameter b
            13.833522 = avgFieldLength
            5.2244897 = fieldLength
      1.19288942E12 = FunctionQuery(date(created_time)), product of:
        1.49111177E12 = date(created_time)=2017-04-02T05:43:00Z
        0.8 = boost
        1.0 = queryNorm
      22.4 = FunctionQuery(int(likes)), product of:
        28.0 = int(likes)=28
        0.8 = boost
        1.0 = queryNorm
    

    为了清楚起见 - 此说明仅适用于您的结果集中带有 id= 23379598044_10154409629363045 的文档。

    让我们分解一下1.19288942E12 的总分。正如它所说 - 它是 3 部分的总和:

    1. 4.6113086 = weight(description:samsung in 61828) - 这部分与您的查询本身密切相关。由于您的查询是q=Samsung 和qf=description^0.8,这意味着如果文档将匹配到字段description - 那么DisMax 会将值提高0.8 倍(这里是qf param 的参考)。这就是解释说的:4.6113086 ... is product of: 0.8 = boost, 4.2966447 = idf and 1.3415436 = tfNorm。请注意,Solr TF/IDF。
    2. 1.19288942E12 = FunctionQuery(date(created_time)) - 这部分与bf=created_time^0.8 部分相关(为了解释,我排除了likes^0.8 - 基本上它将在最后一个要点中介绍)。 Solr (DisMax) 在这里做什么 - 它为这个特定文档 (2017-04-02T05:43:00Z) 获取 created_time 的值,然后将其转换为 UNIX 时间戳 (1.49111177E12),然后将其乘以因子0.8。您可能会注意到 1.19288942E12 是一个相当大的数字,如果您将其与初始 TF/IDF 进行比较。通常它实际上效率低下,我建议为此目的使用一些标准化函数,如 reciprocal。
    3. 22.4 = FunctionQuery(int(likes)) - 这部分与bf=likes^0.8 有关。基本上,Solr 还将获取此特定文档 (28) 的字段值并将其乘以 0.8 倍。这是我的小笔记:如果你知道这个字段的值的分布——那很好——也许这在实践中很有用。但有时你永远不知道你的分布,也值得标准化你的领域——例如应用一些scalefunction。我不是坚持 - 只是一些建议:)

    希望它能给你一些提示,以便更好地“解释”理解 :)

    【讨论】:

    • 真的很感激!
    • 从网上找到计算真的很难。它将汇总喜欢、日期和与查询的相关性?
    • 确切地说,它将是 3 个部分的总和 :) 另一边是这些部分的大小不同,即相关性将是 ~10,喜欢 ~10^2,日期 ~10^12。因此,对分数的总体影响将基本上基于日期:) 它可能是这种情况并且对您的特定业务案例有效,但一般情况下,它需要额外的相关性调整,如我在要点 #2 和 #3 中所述.
    猜你喜欢
    • 2013-06-26
    • 1970-01-01
    • 2014-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-15
    相关资源
    最近更新 更多