如何在Elasticsearch中查询指定字段下的所有内容取值
ES查询指定字段所有取值的实现方案
你可以根据是否需要去重选择对应方案,你的field2字段为keyword类型,无需额外处理字段名即可直接查询:
方案1:获取去重后的field2所有取值
使用Terms聚合查询,直接返回所有唯一值,符合你给出的示例输出格式要求:
DSL语句
GET indexname/_search { "size": 0, "aggs": { "all_field2": { "terms": { "field": "field2", "size": 10000 } } } }
注:如果
field2的唯一取值总数超过10000,调大size参数的数值即可。
Python实现代码
from elasticsearch import Elasticsearch # 初始化ES客户端,替换为你自己的ES连接配置 es = Elasticsearch(hosts=["http://127.0.0.1:9200"]) resp = es.search( index="indexname", size=0, aggs={ "all_field2": { "terms": { "field": "field2", "size": 10000 } } } ) # 提取结果为数组格式 field2_values = [bucket["key"] for bucket in resp["aggregations"]["all_field2"]["buckets"]] print(field2_values)
输出结果即为你需要的["123", "654", "gfr"]格式。
方案2:获取所有文档的field2原始值(保留重复)
如果需要保留所有文档的字段值(包括重复项),可通过过滤返回字段的方式查询:
DSL语句
GET indexname/_search { "_source": ["field2"], "query": { "match_all": {} }, "size": 10000 }
注:如果文档总数超过10000,不要直接调大
size,改用滚动查询或者search_after批量拉取即可。
Python实现代码
from elasticsearch import Elasticsearch es = Elasticsearch(hosts=["http://127.0.0.1:9200"]) resp = es.search( index="indexname", _source=["field2"], query={"match_all": {}}, size=10000 ) field2_values = [hit["_source"]["field2"] for hit in resp["hits"]["hits"]] print(field2_values)
内容的提问来源于stack exchange,提问作者stanvooz
相关产品推荐
相关产品推荐

