我正在使用评分脚本来使用精确的k-NN进行预过滤。下面是一个示例查询:
GET /my_index/_search
{
"query": {
"script_score": {
"query": {
"bool": {
"filter": {
"bool": {
"must": [
{
"range": {
"price": {
"gte": 200,
"lte": 350
}
}
}
]
}
}
}
},
"script": {
"source": "knn_score",
"lang": "knn",
"params": {
"field": "my_vector",
"query_value": [1.5, 5.5, 4.5, 6.4],
"space_type": "cosinesimil"
}
}
}
}
}
下面是响应的示例:
"max_score": 1.017859,
"hits": [
{
"_index": "my_index",
"_id": "1234",
"_score": 1.017859,
"_source": {
"my_vector": [
1.7,
4.9,
4.8,
5.3
],
"price": 250,
"category": 376,
"subcategory": 3265
},
...
}
...
这里的分数是如何计算出来的?为什么超过1?在预过滤(评分脚本)部分之后,是否有一种方法可以获得仅用于k-NN搜索的相似性得分?我的用例是,一旦预过滤完成,仅根据k-NN得分对文档进行排名。我该怎么做?
1条答案
按热度按时间7uzetpgm1#
Opensearch为每个文档的余弦相似度分数加1。实际的余弦相似度可以通过从查询返回的分数中减去1来计算。这是从文档:“余弦相似度返回一个介于-1和1之间的数字,由于OpenSearch相关性得分不能低于0,因此k-NN插件会将1相加以获得最终得分。”
https://opensearch.org/docs/latest/search-plugins/knn/knn-score-script/