如何使用内置脚本knn_score查询opensearch?

问题描述 投票:0回答:1

根据此处提供的文档 - 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': {
         ....
       }
     }
   ]
  }
}
elasticsearch opensearch cosine-similarity amazon-opensearch
1个回答
0
投票

美好的开始!!

实际上,距离/相似度值不能用作分数,因为分数不能为负数,并且

cosinesimil
相似度范围为 -1 到 +1。为了解决这个问题,距离/相似度值需要进行转换以适当的方式以用作分数。

在您的情况下,分数是使用一个简单的公式根据

cosinesimil
值计算得出的,即
score = 2 - d
,其中
d
是查询向量与索引向量相比的余弦相似度。

由于得分为 1.12,这意味着有效余弦相似度为 0.88,这意味着查询向量与第一次命中相比具有约 28° 的角度,非常接近。

© www.soinside.com 2019 - 2024. All rights reserved.