评分配置文件如何在 Azure 搜索中生成分数?
How do scoring profiles generate scores in Azure Search?
我想在我的 Azure 搜索索引上添加评分配置文件。更具体地说,我索引中的每个文档都有一个类型为 Edm.Double
的 weight
字段,我想根据这个值提升它们。我不想直接根据 weight
对它们进行排序,因为搜索词的相关性也很重要。
所以为了测试它,我创建了一个评分配置文件,其幅度函数的提升值为 1000(只是为了看看我是否了解它是如何工作的)、线性插值、起始值 0 和结束值 1。什么我期待的是将提升值添加到整体搜索分数中。因此,权重为 0.5 的文档将获得 500 的提升,而权重为 0.125 的文档将获得 125 的提升。然而,由此产生的分数远没有这么直观。
在这种情况下我有几个问题:
1) 这种情况下函数score是怎么产生的?我有权重彼此接近的文档(假设为 0.5465 和 0.5419),但它们的最终分数之间的差异约为 100-150,而我预计它约为 4-5。
2) 每个搜索结果的函数分数和权重如何聚合成最终分数?
感谢您提供详细信息。两份文件的基本相关性分数是多少?
评分配置文件中提供的提升因子实际上 乘以 到使用术语频率计算的基本相关性分数。例如,假设两个文档的基本分数(在响应负载中的@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) * (weight (0.5419) - min(0)) / max - min (1) = final_search_score(108.38)
如果您得到的最终分数与上述功能不一致,请告诉我。谢谢!
内特
所以 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
林肯公园的著名专辑。假设我们的索引中有以下文档。
{
"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
之后将评估评分配置文件功能。在这种情况下有 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
.
希望你喜欢这个例子。
我想在我的 Azure 搜索索引上添加评分配置文件。更具体地说,我索引中的每个文档都有一个类型为 Edm.Double
的 weight
字段,我想根据这个值提升它们。我不想直接根据 weight
对它们进行排序,因为搜索词的相关性也很重要。
所以为了测试它,我创建了一个评分配置文件,其幅度函数的提升值为 1000(只是为了看看我是否了解它是如何工作的)、线性插值、起始值 0 和结束值 1。什么我期待的是将提升值添加到整体搜索分数中。因此,权重为 0.5 的文档将获得 500 的提升,而权重为 0.125 的文档将获得 125 的提升。然而,由此产生的分数远没有这么直观。
在这种情况下我有几个问题:
1) 这种情况下函数score是怎么产生的?我有权重彼此接近的文档(假设为 0.5465 和 0.5419),但它们的最终分数之间的差异约为 100-150,而我预计它约为 4-5。
2) 每个搜索结果的函数分数和权重如何聚合成最终分数?
感谢您提供详细信息。两份文件的基本相关性分数是多少?
评分配置文件中提供的提升因子实际上 乘以 到使用术语频率计算的基本相关性分数。例如,假设两个文档的基本分数(在响应负载中的@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) * (weight (0.5419) - min(0)) / max - min (1) = final_search_score(108.38)
如果您得到的最终分数与上述功能不一致,请告诉我。谢谢!
内特
所以 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
林肯公园的著名专辑。假设我们的索引中有以下文档。
{
"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
之后将评估评分配置文件功能。在这种情况下有 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
.
希望你喜欢这个例子。