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

在Elasticsearch中查询含嵌套对象的数组以获取多个对象

解决Elasticsearch中筛选数组内多个匹配对象的问题

嘿,我明白你的困扰!你要从segments数组里找出所有id是"ABC"或"DEF"的对象,其实用Elasticsearch的nested查询配合terms或者bool should就能实现,关键是要用上inner_hits来精准返回匹配的数组元素,而不是整个文档。

前提:确认字段类型

首先得确保你的segments字段在映射里是**nested类型**,如果是普通的object类型,Elasticsearch会把数组里的对象扁平化存储,导致查询时无法精准匹配单个对象(会返回包含任意匹配项的整个文档,且没法只提取匹配的数组元素)。

如果还没设置成nested类型,先更新映射:

PUT /your_index/_mapping
{
  "properties": {
    "segments": {
      "type": "nested"
    }
  }
}

实现多匹配对象的查询

接下来就可以写查询语句了,用nested查询指定路径,然后用terms查询匹配多个id值,最后通过inner_hits返回仅匹配的数组元素:

GET /your_index/_search
{
  "query": {
    "nested": {
      "path": "segments",
      "query": {
        "terms": {
          "segments.id": ["ABC", "DEF"]
        }
      },
      "inner_hits": {} // 只返回匹配的segments对象
    }
  }
}

补充:用bool should实现(效果和terms一致)

如果你更习惯用bool should来写多条件匹配,也可以这样:

GET /your_index/_search
{
  "query": {
    "nested": {
      "path": "segments",
      "query": {
        "bool": {
          "should": [
            {"match": {"segments.id": "ABC"}},
            {"match": {"segments.id": "DEF"}}
          ],
          "minimum_should_match": 1
        }
      },
      "inner_hits": {}
    }
  }
}

注意事项

  • 如果你的segments是普通object类型,虽然可以用脚本字段过滤,但性能很差,而且不能精准返回匹配的元素,强烈建议改成nested类型。
  • inner_hits会在返回结果里单独列出匹配的segments对象,你可以在inner_hits里添加size参数来控制返回数量,比如"inner_hits": {"size": 10}。

内容的提问来源于stack exchange,提问作者Pushkar Kastoori

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 16:37:46