在Elasticsearch中查询含嵌套对象的数组以获取多个对象
解决Elasticsearch中筛选数组内多个匹配对象的问题
嘿,我明白你的困扰!你要从segments数组里找出所有id是"ABC"或"DEF"的对象,其实用Elasticsearch的nested查询配合terms或者bool should就能实现,关键是要用上inner_hits来精准返回匹配的数组元素,而不是整个文档。
前提:确认字段类型
首先得确保你的segments字段在映射里是**nested类型**,如果是普通的object类型,Elasticsearch会把数组里的对象扁平化存储,导致查询时无法精准匹配单个对象(会返回包含任意匹配项的整个文档,且没法只提取匹配的数组元素)。
如果还没设置成nested类型,先更新映射:
PUT /your_index/_mapping { "properties": { "segments": { "type": "nested" } } }
实现多匹配对象的查询
接下来就可以写查询语句了,用nested查询指定路径,然后用terms查询匹配多个id值,最后通过inner_hits返回仅匹配的数组元素:
GET /your_index/_search { "query": { "nested": { "path": "segments", "query": { "terms": { "segments.id": ["ABC", "DEF"] } }, "inner_hits": {} // 只返回匹配的segments对象 } } }
补充:用bool should实现(效果和terms一致)
如果你更习惯用bool should来写多条件匹配,也可以这样:
GET /your_index/_search { "query": { "nested": { "path": "segments", "query": { "bool": { "should": [ {"match": {"segments.id": "ABC"}}, {"match": {"segments.id": "DEF"}} ], "minimum_should_match": 1 } }, "inner_hits": {} } } }
注意事项
- 如果你的
segments是普通object类型,虽然可以用脚本字段过滤,但性能很差,而且不能精准返回匹配的元素,强烈建议改成nested类型。 inner_hits会在返回结果里单独列出匹配的segments对象,你可以在inner_hits里添加size参数来控制返回数量,比如"inner_hits": {"size": 10}。
内容的提问来源于stack exchange,提问作者Pushkar Kastoori
相关产品推荐
相关产品推荐

