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

如何为Elasticsearch的kNN搜索添加聚合功能?

Elasticsearch KNN搜索结果实现分面搜索的解决方案

方案1:使用search API结合KNN查询(推荐)

从Elasticsearch 8.11版本开始,search API已支持直接传入knn查询条件,可直接添加聚合参数,完全适配分面搜索需求。

示例请求:

POST /your_index/_search
{
  "query": {
    "knn": {
      "your_vector_field": {
        "vector": [0.1, 0.2, 0.3],
        "k": 20
      }
    }
  },
  "aggs": {
    "category_facet": {
      "terms": {
        "field": "category.keyword"
      }
    },
    "price_range_facet": {
      "range": {
        "field": "price",
        "ranges": [
          {"to": 100},
          {"from": 100, "to": 500},
          {"from": 500}
        ]
      }
    }
  },
  "size": 20
}

该方案无需额外逻辑,直接复用search API的聚合能力,性能与兼容性最优,建议优先升级到支持该特性的ES版本。

方案2:KNN搜索+IDS查询聚合(兼容旧版本)

若ES版本低于8.11,无法在search API中使用KNN查询,可分两步实现:

  1. 调用knn_search获取匹配文档的ID列表
  2. 用search API的ids查询过滤这些文档,同时添加聚合参数

第一步:获取KNN匹配的文档ID

POST /your_index/_knn_search
{
  "knn": {
    "your_vector_field": {
      "vector": [0.1, 0.2, 0.3],
      "k": 100
    }
  },
  "_source": false,
  "fields": ["_id"]
}

第二步:基于ID列表执行聚合查询

POST /your_index/_search
{
  "query": {
    "ids": {
      "values": ["doc_1", "doc_2", "doc_3", ...]
    }
  },
  "aggs": {
    "brand_facet": {
      "terms": {
        "field": "brand.keyword"
      }
    }
  },
  "size": 20
}

注意事项:

  • 需根据业务场景设置合适的k值,确保覆盖所有需要参与聚合的KNN匹配文档,避免聚合结果不全
  • 若k值过大,会增加两次请求的性能开销,需在结果完整性和性能之间做权衡

内容的提问来源于stack exchange,提问作者namespace-Pt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 18:57:17