elasticsearch 使用评分脚本时,如何获得纯k-NN评分?OpenSearch

wfsdck30  于 2023-10-17  发布在  ElasticSearch
关注(0)|答案(1)|浏览(197)

我正在使用评分脚本来使用精确的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得分对文档进行排名。我该怎么做?

7uzetpgm

7uzetpgm1#

Opensearch为每个文档的余弦相似度分数加1。实际的余弦相似度可以通过从查询返回的分数中减去1来计算。这是从文档:“余弦相似度返回一个介于-1和1之间的数字,由于OpenSearch相关性得分不能低于0,因此k-NN插件会将1相加以获得最终得分。”
https://opensearch.org/docs/latest/search-plugins/knn/knn-score-script/

相关问题