【问题标题】:How to filter by score in Elastic KNN search?如何在 Elastic KNN 搜索中按分数过滤?
【发布时间】:2022-09-24 11:31:52
【问题描述】:

我有以下映射的索引:

{
  \"test-2\": {
    \"mappings\": {
      \"properties\": {
        \"advert_id\": {
          \"type\": \"integer\"
        },
        \"fraud\": {
          \"type\": \"boolean\"
        },
        \"photos\": {
          \"properties\": {
            \"id\": {
              \"type\": \"integer\"
            },
            \"vector\": {
              \"type\": \"dense_vector\",
              \"dims\": 3,
              \"index\": true,
              \"similarity\": \"l2_norm\"
            }
          }
        },
        \"rating\": {
          \"type\": \"long\"
        }
      }
    }
  }
}

以下是我的数据在 Elastic 中的保存方式:

 {
    \"advert_id\": 123,
    \"fraud\": true,
    \"photos\": [
      {
        \"id\": 456,
        \"vector\": [
          213.32,
          3.23,
          4.21
        ]
      }
    ]
  }

我想根据 KNN 算法搜索具有相似向量的数据。这是我的查询:

GET /test-2/_knn_search
{
  \"knn\": {
    \"field\": \"photos.vector\",
    \"k\": 1,
    \"num_candidates\": 5,
    \"query_vector\": [213.32, 3.23, 4.22]
  }
}

每次点击 Elastic 都会返回一个分数。问题是如何获得分数超过N 的数据?它知道min_score,但无法在此查询中应用它。

  • 据我所知这是不可能的,但你可以试试post_filter。我没有任何可用的 knn 正在运行的实例,因此无法验证它。
  • 谢谢!但是,post_filter 里面应该有什么?是否可以访问 _score 字段?
  • 我不确定,但您可以查看this 文档。

标签: elasticsearch knn


【解决方案1】:

从 Elasticsearch 8.4.0 开始,kNN 搜索 API (/_knn_search) 已将 integrated 纳入搜索 API (/_search),我们可以使用 min_score 选项,如下所示:

- GET /test-2/_knn_search
+ GET /test-2/_search
{
  "knn": {
    "field": "photos.vector",
    "k": 1,
    "num_candidates": 5,
    "query_vector": [213.32, 3.23, 4.22]
  },
+ "min_score": N
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-03
    • 2013-05-25
    • 2012-12-04
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 2014-07-01
    相关资源
    最近更新 更多