Elasticsearch嵌套查询后过滤并映射结果的实现需求
Elasticsearch查询与数据提取方案
背景与需求
现有索引数据结构(嵌套类型payload)如下:
{ "payload": [ { "category": "GENRE", "value": "Comedy" }, { "category": "DATE", "value": "1970-01-01T00:00:00" }, { "category": "COLOUR", "value": "Red" }, { "category": "COLOUR", "value": "Green" } ] }
需要实现的查询逻辑:
- 筛选出payload中包含category为GENRE且value为Comedy的文档
- 提取这些文档里payload中category=COLOUR的所有value,最终输出格式为:
{ "values": [ "Red", "Green" ] }
现有问题
你提供的查询语句使用了嵌套查询,但条件匹配的是ASSET相关内容,未对应需求中的GENRE=Comedy筛选,同时也没有做后续的数据提取处理。
正确实现方案
方案一:使用聚合高效提取(推荐批量场景)
通过嵌套查询筛选文档,再结合聚合提取目标颜色值:
GET /dev_video_clip_59f977063265a634a8ae15bf/_search { "size": 0, // 无需返回原始文档,仅获取聚合结果 "query": { "nested": { "path": "payload", "query": { "bool": { "must": [ { "match": { "payload.category": "GENRE" } }, { "match": { "payload.value": "Comedy" } } ] } } } }, "aggs": { "filter_colour_entries": { "nested": { "path": "payload" }, "aggs": { "only_colour_category": { "filter": { "match": { "payload.category": "COLOUR" } }, "aggs": { "colour_value_list": { "terms": { "field": "payload.value.keyword", // 使用keyword字段保证精确匹配 "size": 100 // 根据实际数据量调整上限 } } } } } } } }
结果处理
聚合返回结果中,aggregations.filter_colour_entries.only_colour_category.colour_value_list.buckets下的每个key就是需要的颜色值,将这些key收集后即可生成目标格式的输出。
方案二:使用inner_hits提取(适合单/少量文档)
通过inner_hits直接返回符合条件的payload条目,再提取value:
GET /dev_video_clip_59f977063265a634a8ae15bf/_search { "_source": false, // 不返回完整原始文档 "query": { "bool": { "filter": [ { "nested": { "path": "payload", "query": { "bool": { "must": [ { "match": { "payload.category": "GENRE" } }, { "match": { "payload.value": "Comedy" } } ] } } } } ] } }, "inner_hits": { "colour_payload": { "path": "payload", "query": { "match": { "payload.category": "COLOUR" } }, "_source": ["payload.value"] // 仅返回value字段 } } }
结果处理
从返回的hits.hits[].inner_hits.colour_payload.hits.hits中提取每个文档的_source.payload.value,收集后整理成目标格式即可。
内容的提问来源于stack exchange,提问作者lovedeep sangha
相关产品推荐
相关产品推荐

