评分配置文件如何在Azure搜索中生成分数?

hal*_*lei 5 ranking azure-cognitive-search

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

所以只是为了测试它,我创建了一个带有幅度函数的得分曲线,其增益值为1000(只是为了看看我是否得到了这个东西如何工作),线性插值,起始值0和结束值1.我所期待的是提升值将添加到整体搜索得分中.因此,重量为0.5的文档将获得500的提升,而重量为0.125的文档将获得125的提升.但是,得到的分数远不如此直观.

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

1)在这种情况下如何生成功能分数?我的文件权重彼此接近(假设为0.5465和0.5419),但最终得分之间的差异大约为100-150,而我预计它会在4-5左右.

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

Nat*_* Ko 5

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

评分配置文件中提供的提升因子实际上乘以使用术语频率计算的基本相关性分数。例如,假设响应负载中@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)

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

内特


Dib*_*ran 5

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

因此,当用户执行搜索时,query会为 Azure 搜索提供一个。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
    }  
  ]
}
Run Code Online (Sandbox Code Playgroud)

假设输入的查询是meteoraLinkin 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" 
}
Run Code Online (Sandbox Code Playgroud)

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

{
    "albumTitle": 1,
    "genre": 0,
    "genreDescription": 0,
    "artistName": 0
}
Run Code Online (Sandbox Code Playgroud)

评分配置文件在专辑标题字段上的权重为 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

希望你禁止这个例子。