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
相关产品推荐
相关产品推荐

