我想在Azure Search上的索引上添加评分配置文件。更具体地说,我的索引中的每个文档都有一个类型为weight
的{{1}}字段,我想根据此值来提升它们。我不想直接对Edm.Double
进行排序,因为搜索词的相关性也很重要。
所以只是为了测试它,我创建了一个具有幅度函数的得分曲线,其增强值为1000(只是为了看看我是否得到了这个东西如何工作),线性插值,起始值0和结束值1.我是什么期望是将增加值添加到整体搜索得分中。因此,重量为0.5的文档将获得500的提升,而重量为0.125的文档将获得125的提升。但是,得到的分数远不如此直观。
在这种情况下我有几个问题:
1)在这种情况下如何生成功能分数?我的文件权重彼此接近(假设为0.5465和0.5419),但最终得分之间的差异大约在100-150之间,而我预计它会在4-5左右。
2)如何将功能得分和权重汇总到每个搜索结果的最终得分中?
答案 0 :(得分:4)
感谢您提供详细信息。这两份文件的基本相关性分数是多少?
评分配置文件中提供的提升因子实际上乘以到使用术语频率计算的基本相关性得分。例如,假设两个文档中响应有效载荷中@ search.score中给出的基本分数分别为0.5和0.2,权重列中的值分别为0.5465和0.5419。使用上面给出的评分配置文件配置,起始值为0,结束值为1,线性插值和提升因子为1000.每个文档的最终得分计算如下:
文件1: base 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)
如果您得到的最终分数与上述功能不一致,请告诉我。谢谢!
内特
答案 1 :(得分:1)
因此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
}
]
}
让我们说输入的查询是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
}
评分配置文件在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。所以a为4星显然是4 / 5 = 0.8
。幅度函数的增强值为8,因此我们必须将该值乘以8。0.8 * 8 = 6.4
。
functionAggregation
为0,这意味着我们必须对所有函数的结果求和。提供给我们得分配置文件功能的总得分:6.4 + 8.630 = 15.03
。然后,规则是将总得分配置文件功能得分乘以字段的总加权得分,从而得出总计15.03 + 1.5 = 16.53
。
希望您接受了此示例。