如何用内置脚本knn_score查询OpenSearch?向量距离是否为_score?
向量相似度查询的得分与操作问题
问题详情
我根据OpenSearch的KNN评分脚本文档创建了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字段(示例值为1.12),想确认:向量间的距离是不是通过_score返回的?还是我的操作存在错误?
解答
操作中的错误点
- 索引不匹配:创建的索引是
test-index,但查询的是my-knn-index-1,查询目标并非你写入数据的索引。 - 字段不匹配:索引映射定义的向量字段是
my_vector1,但查询脚本指定的是my_vector2,该字段不存在于你的索引中。 - 维度不匹配:创建的向量维度为1024,但查询的
query_value仅4维,维度不一致无法计算相似度。
得分与距离的关系
当使用cosinesimil(余弦相似度)作为空间类型时,knn_score返回的_score不是原始距离,而是1 + 余弦相似度。余弦相似度的取值范围是[-1, 1],因此_score的范围是[0, 2]:
- 得分越高,向量相似度越高
- 对应的余弦距离(1 - 余弦相似度)越小
如果需要直接获取余弦距离,可对得分做转换:用2 - _score即可得到对应的余弦距离值。
内容的提问来源于stack exchange,提问作者kishi
相关产品推荐
相关产品推荐

