You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用内置脚本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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 03:47:06