如何在Elasticsearch KNN搜索中按分数过滤结果?
Elasticsearch KNN搜索中使用min_score过滤结果
问题场景
你的test-2索引映射如下:
{ "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" } } } } }
数据存储格式示例:
{ "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] } }
你需要过滤出分数大于指定值N的结果,想知道如何在该查询中应用min_score参数。
解决方法
直接将min_score参数添加到_knn_search请求的顶层(与knn字段同级)即可。示例如下(假设N为0.01):
GET /test-2/_knn_search { "knn": { "field": "photos.vector", "k": 1, "num_candidates": 5, "query_vector": [213.32, 3.23, 4.22] }, "min_score": 0.01 }
注意事项
由于你使用的是l2_norm相似度算法,KNN返回的分数是欧氏距离值:
- 分数越小,说明目标向量与查询向量的相似度越高
- 如果你的实际需求是保留相似度高的文档,应该设置
min_score为一个较小的阈值(比如只保留距离小于0.1的结果),此时需要确认逻辑是否与“分数大于N”的需求匹配。
内容的提问来源于stack exchange,提问作者neo
相关产品推荐
相关产品推荐

