首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Azure搜索中生成评分配置文件?

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

Stack Overflow用户
提问于 2017-01-02 13:40:25
回答 2查看 3K关注 0票数 8

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

因此,为了检验它,我创建了一个评分配置文件,它的大小函数为boost值1000 (只是为了看看我是否得到了这个函数的工作原理)、线性插值、起始值0和结束值1。我所期望的是将这个提升值添加到整个搜索得分中。因此,重量为0.5的文档将得到500的提升,而重量为0.125的文档将得到125的提升。然而,由此产生的分数远未达到如此直观的程度。

在这个案子里,我有几个问题:

1)在这种情况下,如何生成函数分数?我有权重相近的文档(比方说0.5465和0.5419),但它们的最终得分之间的差异在100到150之间,而我认为大约是4-5。

2)如何将函数分数和权重汇总成每个搜索结果的最终得分?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-04 00:47:17

谢谢你提供的细节。这两份文件的基本相关分数是多少?

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

文件1:基准search_score(0.5) * boost_factor (1000) *(重量(0.5465) - min(0)) / max - min (1) = final_search_score(273.25)

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

如果你得到的最后分数不符合上面的函数,请告诉我。谢谢!

内特

票数 5
EN

Stack Overflow用户

发布于 2020-06-11 12:49:16

因此,Nate给出的答案很难理解,而且漏掉了一些组件。我已经对整个得分过程做了一个概述,它相当复杂。

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

评分概要文件也可能包含评分功能。评分功能可以是一个大小,新鲜度,地理或标签的功能。多个功能可以在一个评分配置文件内进行。

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

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

代码语言:javascript
复制
{  
  "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的著名专辑。假设我们的索引中有以下文档。

代码语言:javascript
复制
{
    "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-以色列国防军的专家,但我可以想象会产生以下未加权分数:

代码语言:javascript
复制
{
    "albumTitle": 1,
    "genre": 0,
    "genreDescription": 0,
    "artistName": 0
}

得分剖面在albumTitle字段中的权重为1.5,因此加权总分为:1 * 1.5 + 0 + 0 + 0 = 1.5

在此之后,将对评分概要函数进行评估。在这种情况下,有2。第一次评估新鲜度的范围为365天,一年。最近更新的字段的值为今年4月1日。让我们说,从现在起的50天。总的范围是365,所以如果最后更新的日期是今天,你将得到1分。和0,如果它的365天或更多的过去。在我们的例子中,它是1 - 50 / 365 = 0.8630..。函数的提升是10,所以第一个函数的得分是8.630

第二个函数是一个星等函数,范围从1到5。该文档得到了一个4星的评级,因此值0.8,因为1颗星是0,5颗星是1。所以对于4星来说,a很明显是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的积分。

希望你禁止了这个例子。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41427940

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档