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

Elasticsearch查询如何简化返回结果 仅返回指定字段值

实现方案

Elasticsearch 没有完全开箱即用的原生参数直接生成你要求的两种返回格式,但可以通过官方提供的返回过滤功能配合极少量的业务代码实现,成本极低。


第一种格式(保留外层元数据,hits数组仅含指定字段)

你可以使用ES原生的filter_path响应过滤参数,先移除所有不需要的返回字段,仅保留需要的外层元数据和_source下的指定字段:
请求示例(在查询URL后加参数):

POST /your_index/_search?filter_path=took,timed_out,_shards,hits.total,hits.max_score,hits.hits._source.id

请求体和你现在使用的一致:

{
  "from": "0",
  "size": "2",
  "_source": ["id"],
  "query": {
    "match_all": {}
  }
}

此时返回的结果会过滤掉所有无用的元数据,结构如下:

{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 10000,
      "relation" : "gte"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_source" : {
          "id" : 38142
        }
      },
      {
        "_source" : {
          "id" : 38147
        }
      }
    ]
  }
}

你只需要在业务代码中对hits.hits数组做一次简单遍历,把每个元素的_source取出来替换当前元素即可得到你期望的第一种格式,单语言实现通常不超过3行代码。


第二种格式(仅返回字段数组)

调整filter_path参数,仅保留_source字段即可:
请求URL示例:

POST /your_index/_search?filter_path=hits.hits._source.id

返回结果如下:

{
  "hits" : {
    "hits" : [
      {
        "_source" : {
          "id" : 38142
        }
      },
      {
        "_source" : {
          "id" : 38147
        }
      }
    ]
  }
}

你只需要取出hits.hits.*._source即可得到你需要的纯字段数组,注意你给出的第二种期望格式本身是不合法的JSON,外层应该用数组包裹而非对象。


额外说明

如果完全不想在业务层做转换,也可以使用ES的脚本字段功能将字段提升到返回结果的顶层,但该方式会产生额外的查询性能开销,性价比远低于业务层做简单遍历处理,非特殊场景不推荐使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 12:15:08