Azure搜索中的评分配置是如何生成分数的?

9
我想在Azure搜索中的索引上添加一个评分方案。 更具体地说,我的索引中的每个文档都有一个类型为“Edm.Double”的“weight”字段,我想根据此值进行加权。 我不希望仅按照“weight”直接对它们进行排序,因为搜索词的相关性也很重要。
所以仅仅为了测试一下,我创建了一个评分方案,其中包含一个具有1000倍增益值的大小函数(只是为了看看这个东西是如何工作的),线性插值,起始值为0,结束值为1。我期望的是增益值将被添加到整体搜索得分中。 因此,重量为0.5的文档将获得500的提升,而重量为0.125的文档将获得125的提升。 但是,结果得分远非如此直观。
在这种情况下,我有几个问题:
1)在这种情况下如何生成函数分数?我有一些权重相近的文档(比如0.5465和0.5419),但它们的最终分数之间的差异约为100-150,而我希望它在4-5左右。
2)如何将函数分数和权重汇总为每个搜索结果的最终分数?
2个回答

7

提供的Nate的答案难以理解,并且缺失一些组件。我概述了整个评分过程,它非常复杂。

当用户执行搜索时,将向Azure Search提供一个“查询”。 Azure搜索使用TF-IDF算法根据形成的“标记”通过分析器确定0-1分数。请记住,语言特定的分析器可能会为一个单词生成多个标记。对于每个可搜索字段,都将生成分数,然后将其乘以评分文件中的权重。最后,所有加权分数将被总结,并得出初始加权分数。

评分文件还可能包含评分函数。评分函数可以是基于数量、新鲜度、地理位置或标签的函数。一个评分文件中可以制作多个函数。

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

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

{  
  "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
    }  
  ]
}

假设输入的查询是Linkin Park著名专辑"Meteora",我们假设在索引中有以下文档。
{
    "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
}

评分配置文件对于albumTitle字段的权重为1.5,因此总加权分数将为:1 * 1.5 + 0 + 0 + 0 = 1.5

然后将评分配置文件功能进行评估。在本例中有两个函数。第一个函数使用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

希望您喜欢这个例子。


最后一行有些令人困惑:“规则是将总评分配置函数得分与字段的总加权得分相乘,从而得出一个总分:15.03 + 1.5 = 16.53”。这里是乘以还是加上加权基础分? - Pankaj Yadav
请查看这篇详细的博客文章。加权分数的总和将与聚合函数得分相乘。https://dibranmulder.github.io/2020/09/22/Improving-your-Azure-Search-performance/ - Dibran
在这种情况下,不应该是15.03*1.5=22.545吗?即将总评分配置函数得分(15.03)乘以字段的加权分数(1.5)。你在这里做加法 15.03+1.5=16.53,我有什么遗漏吗? - Pankaj Yadav
1
@PankajYadav 是的,我犯了一个错误,已经编辑过了。 - Dibran

6
感谢提供详细信息。这两个文档的基础相关性分数是多少?在评分配置文件中提供的增强因子实际上是乘以使用词项频率计算的基础相关性分数。例如,假设响应有效载荷中@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: 基础search_score(0.2)* boost_factor(1000)*(weight(0.5419)- min(0))/ max-min(1)= final_search_score(108.38)
如果您获得的最终得分与上述功能不符,请告诉我。谢谢!
Nate

谢谢Nate,这完美地回答了我的问题。不过我需要澄清的是每个字段的权重使用。如果我的字段有权重,那么首先会使用这些权重计算基础分数,然后使用这个基础分数,计算你解释的公式,对吗? - halileohalilei
1
如果您在提及评分配置文件中的字段权重,是的,字段权重已经在基础分数中计算过了,然后会应用额外的提升。 - Nate Ko
再次感谢你,Nate。还有最后一件事。得分函数中最小值的文档是否总是获得0的最终得分?在我的情况下,weight - min 可能为0,但在这种情况下,我不希望该文档深入搜索结果,我只是不想提高它并保持其原始基础分数。因此,我想要将插值增强因子与基础分数相加,而不是将它们相乘。有没有办法做到这一点?或者有其他解决方案吗? - halileohalilei
1
@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。我是否遗漏了什么或者方程式在最新版本中已更改? - Bhavesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接