如何在Elasticsearch中筛选gender为female的嵌套对象并获取最大id值
Elasticsearch筛选female后获取最大id的解决方案
问题描述
需筛选gender为female的文档(或嵌套对象),从中获取最大的id字段值,预期结果为id=34且gender=female。
文档数据
假设abc是嵌套数组字段(符合“嵌套对象”描述),完整结构如下:
{ "abc": [ { "id": 28, "gender": "female", "city": "South vales", "state": "US", "gid": 56, "value": "Money", "type": "Dollars", "date": "2021-06-30", "edited_by": "xyz" }, { "id": 29, "gender": "male", "city": "Mumbai", "state": "India", "gid": 55, "value": "Money", "type": "Dollars", "date": "2020-06-24", "edited_by": "hjk" }, { "id": 34, "gender": "female", "city": "Austin", "state": "US", "gid": 98, "value": "Money", "type": "Dollars", "date": "2022-05-25", "edited_by": "opi" } ] }
原查询问题
你之前的查询未添加过滤条件,也未处理嵌套对象的访问逻辑,因此无法得到预期结果:
GET abc/_search { "aggs": { "max_id": { "max": { "field": "id" } } } }
正确查询方案
情况1:gender和id为顶级字段(无嵌套结构)
如果gender和id是文档的顶级字段,只需添加term查询过滤gender: female,再执行最大值聚合:
GET abc/_search { "size": 0, // 无需返回原始文档,仅查看聚合结果 "query": { "term": { "gender.keyword": "female" } }, "aggs": { "max_female_id": { "max": { "field": "id" } } } }
情况2:abc为nested类型嵌套数组字段
如果abc是嵌套数组,需使用nested聚合进入嵌套上下文,先过滤嵌套对象中gender: female的元素,再聚合最大id:
GET abc/_search { "size": 0, "aggs": { "nested_abc": { "nested": { "path": "abc" }, "aggs": { "filter_female": { "filter": { "term": { "abc.gender.keyword": "female" } }, "aggs": { "max_female_id": { "max": { "field": "abc.id" } } } } } } } }
结果说明
执行上述正确查询后,聚合结果中的max_female_id值即为34,对应gender=female的最大id。
内容的提问来源于stack exchange,提问作者Swapna
相关产品推荐
相关产品推荐

