如何基于Elasticsearch搜索条件列出非空payload字段名
解决Elasticsearch提取符合条件的非空payload属性名问题
要获取满足指定条件的文档中,所有曾出现过的非空payload属性名,你需要借助脚本+聚合的组合来实现,而不是直接返回字段内容。以下是可行的查询方案:
最终查询语句
GET our_alias_name/_search { "size": 0, # 不返回具体文档,只保留聚合结果 "query": { "bool": { "must": [ { "range": { "timestamp": { "gte": "now-6M/M" } } }, { "query_string": { "default_field": "codeMessage", "query": "TRT*" } }, { "match": { "payload.typeObjet.keyword": "paiement" } } ] } }, "aggs": { "non_empty_payload_fields": { "terms": { "script": { "source": """ def fields = []; for (field in doc['payload'].keySet()) { // 检查当前payload子字段是否有非空值 if (doc['payload.' + field].size() > 0) { fields.add(field); } } return fields; """, "lang": "painless" }, "size": 10000 # 调整为足够大的数值,确保返回所有可能的字段名 } } } }
关键部分说明
size: 0:关闭具体文档的返回,减少不必要的数据传输,只聚焦聚合结果。- Painless脚本:遍历
payload下的所有子字段,通过doc['payload.' + field].size() > 0判断字段是否有非空值,收集符合条件的字段名。 terms聚合:对脚本返回的字段名进行去重统计,最终得到所有曾出现过的非空payload属性名列表。size: 10000:Elasticsearch默认只返回前10个聚合结果,设置较大数值可以确保获取全部字段名(根据你的实际字段数量调整)。
返回结果示例
聚合结果会在aggregations.non_empty_payload_fields.buckets中,每个bucket的key就是一个非空的payload属性名,doc_count是该字段出现的文档数量:
{ "aggregations": { "non_empty_payload_fields": { "buckets": [ { "key": "typeObjet", "doc_count": 1200 }, { "key": "montant", "doc_count": 1150 }, { "key": "reference", "doc_count": 980 } ] } } }
内容的提问来源于stack exchange,提问作者ehmd96
相关产品推荐
相关产品推荐

