根据此处提供的文档 - https://opensearch.org/docs/latest/search-plugins/knn/knn-score-script,我在 opensearch 中创建了一个 knn 索引(下面的示例代码)
PUT /test-index
{
"settings": {
"index.knn": true
},
"mappings": {
"properties": {
"my_vector1": {
"type": "knn_vector",
"dimension": 1024,
}
}
}
}
然后我添加/索引了一些数据。文档中还提到,我们可以使用如下脚本来返回您正在搜索的向量之间的距离。
GET my-knn-index-1/_search
{
"size": 4,
"query": {
"script_score": {
"query": {
"match_all": {}
},
"script": {
"source": "knn_score",
"lang": "knn",
"params": {
"field": "my_vector2",
"query_value": [2.0, 3.0, 5.0, 6.0],
"space_type": "cosinesimil"
}
}
}
}
}
对上述查询的响应如下所示。返回的向量之间的距离是_score,还是我这样做不对?
{ ...
hits: {
...
'max_score': 1.12,
'hits': [{
'_index': 'my-knn-index-1',
...
'_score': 1.12,
'_source': {
....
}
}
]
}
}
美好的开始!!
实际上,距离/相似度值不能用作分数,因为分数不能为负数,并且
cosinesimil
相似度范围为 -1 到 +1。为了解决这个问题,距离/相似度值需要进行转换以适当的方式以用作分数。
在您的情况下,分数是使用一个简单的公式根据
cosinesimil
值计算得出的,即 score = 2 - d
,其中 d
是查询向量与索引向量相比的余弦相似度。
由于得分为 1.12,这意味着有效余弦相似度为 0.88,这意味着查询向量与第一次命中相比具有约 28° 的角度,非常接近。