【问题标题】:How do scoring profiles generate scores in Azure Search?评分配置文件如何在 Azure 搜索中生成分数?
【发布时间】:2017-05-16 15:01:42
【问题描述】:

我想在 Azure 搜索的索引上添加评分配置文件。更具体地说,我索引中的每个文档都有一个Edm.Double 类型的weight 字段,我想根据这个值来提升它们。我不想直接根据weight 对它们进行排序,因为搜索词的相关性也很重要。

所以只是为了测试它,我创建了一个带有提升值 1000 的幅度函数的评分配置文件(只是为了看看我是否知道这件事是如何工作的)、线性插值、起始值 0 和结束值 1。我是什么期望是将提升值添加到整体搜索分数中。因此,权重为 0.5 的文档将获得 500 的提升,而权重为 0.125 的文档将获得 125 的提升。但是,得到的分数远没有这么直观。

在这种情况下我有几个问题:

1) 这种情况下的功能分数是如何产生的?我的文档的权重彼此接近(比如说 0.5465 和 0.5419),但它们的最终分数之间的差异在 100-150 左右,而我预计它会在 4-5 左右。

2) 如何将功能得分和权重汇总为每个搜索结果的最终得分?

【问题讨论】:

    标签: ranking azure-cognitive-search


    【解决方案1】:

    因此,Nate 提供的答案很难理解,并且遗漏了一些组件。一世 对整个评分过程进行了概述,并且相当复杂。

    因此,当用户执行搜索时,会向 Azure 搜索提供 query。 Azure 搜索使用TF-IDF 算法根据分析器形成的Tokens 确定0-1 的分数。请记住,特定于语言的分析器可以为一个单词提供多个标记。对于每个可搜索字段,将生成分数,然后根据评分配置文件中的权重生成multiplied。最后将所有加权分数相加,这就是初始加权分数。

    评分配置文件还可能包含评分功能。评分函数可以是幅度、新鲜度、地理或基于标签的函数。可以在一个评分配置文件中实现多种功能。

    函数将被评估,函数的分数可以求和,也可以取平均值、最小值、最大值或第一次匹配。然后将所有函数的总和乘以总加权分数,这就是最终分数。

    一个示例,这是一个带有评分配置文件的示例索引。

    {  
      "name": "musicstoreindex",  
      "fields": [  
        { "name": "key", "type": "Edm.String", "key": true },  
        { "name": "albumTitle", "type": "Edm.String" },  
        { "name": "genre", "type": "Edm.String" },  
        { "name": "genreDescription", "type": "Edm.String", "filterable": false },  
        { "name": "artistName", "type": "Edm.String" },  
        { "name": "rating", "type": "Edm.Int32" },  
        { "name": "price", "type": "Edm.Double", "filterable": false },  
        { "name": "lastUpdated", "type": "Edm.DateTimeOffset" }  
      ],  
      "scoringProfiles": [  
        {  
          "name": "boostGenre",  
          "text": {  
            "weights": {  
              "albumTitle": 1.5,  
              "genre": 5,  
              "artistName": 2  
            }  
          }  
        },  
        {  
          "name": "newAndHighlyRated",  
          "functions": [  
            {  
              "type": "freshness",  
              "fieldName": "lastUpdated",  
              "boost": 10,  
              "interpolation": "linear",  
              "freshness": {  
                "boostingDuration": "P365D"  
              }  
            },  
            {
              "type": "magnitude",  
              "fieldName": "rating",  
              "boost": 8,  
              "interpolation": "linear",  
              "magnitude": {  
                "boostingRangeStart": 1,  
                "boostingRangeEnd": 5,  
                "constantBoostBeyondRange": false  
              }  
            }  
          ],
          "functionAggregation": 0
        }  
      ]
    }
    

    假设输入的查询是meteora Linkin Park 的著名专辑。假设我们的索引中有以下文档。

    {
        "key": 123,
        "albumTitle": "Meteora",
        "genre": "Rock",
        "genreDescription": "Rock with a flick of hiphop",
        "artistName": "Linkin Park",
        "rating": 4,
        "price": 30,
        "lastUpdated": "2020-01-01" 
    }
    

    我不是 TF-IDF 方面的专家,但我可以想象会产生以下未加权分数:

    {
        "albumTitle": 1,
        "genre": 0,
        "genreDescription": 0,
        "artistName": 0
    }
    

    评分资料在专辑标题字段中的权重为 1.5,因此总加权分数将为:1 * 1.5 + 0 + 0 + 0 = 1.5

    之后将评估评分配置文件功能。在这种情况下,有 2 个。第一个评估新鲜度,范围为 365 天,一年。最后更新的字段的值为今年 4 月 1 日。可以说那是从现在开始的 50 天。总范围为 365,因此如果最后更新日期是今天,您将获得 1 分。如果过去 365 天或更长时间,则为 0。在我们的例子中是1 - 50 / 365 = 0.8630..。函数的提升是10,所以第一个函数的得分是8.630

    第二个函数是幅度函数,范围从 1 到 5。该文档获得 4 星评级,因此得分为 0.8,因为 1 星是 0,5 星是 1。所以 4 星显然是4 / 5 = 0.8。幅度函数的提升是 8,所以我们必须将值乘以 8。0.8 * 8 = 6.4

    functionAggregation 为 0,这意味着我们必须对所有函数的结果求和。给我们评分配置文件功能的总分:6.4 + 8.630 = 15.03。然后,规则是将总得分配置文件函数得分与字段的总加权得分相乘,得出总计:15.03 * 1.5 = 22.545

    希望你能采纳这个例子。

    【讨论】:

    • 最后一行在这里令人困惑“然后,规则是将总得分配置文件函数得分与字段的总加权得分相乘,得到总计: @ 987654339@"。是与加权基数相乘还是相加?
    • 请看这篇详细的博文。加权分数的总和乘以聚合函数分数。 dibranmulder.github.io/2020/09/22/…
    • 这种情况下不应该是15.03 * 1.5 = 22.545吗?即,总得分概况函数得分 (15.03) 与字段加权得分 (1.5) 的乘积。你在这里做加法15.03 + 1.5 = 16.53,我错过了什么吗?
    • @PankajYadav 是的,我做了一个嘘声,编辑了它。
    【解决方案2】:

    感谢您提供详细信息。两个文档的基本相关性分数是多少?

    评分配置文件中提供的提升因子实际上乘以到使用词频计算的基本相关性分数。例如,假设在响应负载中的@search.score 中给出的两个文档的基本分数分别为 0.5 和 0.2,权重列中的值分别为 0.5465 和 0.5419。使用上面给出的评分配置文件,起始值为 0,结束值为 1,线性插值,提升因子为 1000。您为每个文档获得的最终分数计算如下:

    文档 1: 基础 search_score(0.5) * boost_factor (1000) * (weight (0.5465) - min(0)) / max - min (1) = final_search_score(273.25)

    文档 2: base_search_score(0.2) * boost_factor (1000) * (weight (0.5419) - min(0)) / max - min (1) = final_search_score(108.38)

    如果您得到的最终分数不符合上述功能,请告诉我。谢谢!

    内特

    【讨论】:

    • 谢谢 Nate,这完美地回答了我的问题。我需要澄清的一个问题是对每个字段使用权重。如果我的字段有权重,首先使用这些权重计算基础分数,然后使用这个基础分数,计算你解释的公式,对吗?
    • 如果您指的是评分配置文件中的字段权重,是的,该字段权重已计入基本分数,然后应用额外的提升。
    • 再次感谢内特。还有最后一件事。评分函数中具有最小值的文档是否总是得到最终分数 0?在我的情况下,weight - min 可能是 0,但在这种情况下,我不希望该文档深入搜索结果,我只是不希望它被提升并保持其原始基本分数。因此,我不想将插值提升因子与基本分数相乘,而是将它们相加。有没有办法做到这一点?或者这个问题的任何其他解决方案?
    • @NateKo - 来自 elasticsearch 背景,尝试使用 Azure 搜索。我正在使用评分配置文件功能,但没有按照上面提到的等式获得分数。在我的例子中,我有 0.71231794 作为 base_search_score,boost_factor = 2,weight(field value) = 3,min = 0 和 max = 5。所以,通过上述函数,新分数应该是 (0.71231794×2×(3−0)) ÷5 = 0.854781528。但我得到的最终分数是 1.1397088。我是否遗漏了什么或公式在最新版本中发生了变化?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-26
    • 2016-09-09
    • 1970-01-01
    • 1970-01-01
    • 2015-07-01
    • 1970-01-01
    • 2020-11-03
    相关资源
    最近更新 更多