ElasticSearch如何对嵌套对象数组按指定多条件筛选查询
ElasticSearch 嵌套对象数组多条件筛选方案
前置要求:字段类型定义
你的region字段必须在索引mapping中声明为nested类型,普通object类型会把嵌套对象的同名字段打平为独立数组,无法保证筛选条件作用在同一个嵌套对象上。
创建索引时的mapping示例:
PUT /你的索引名 { "mappings": { "properties": { "region": { "type": "nested", "properties": { "reg": { "type": "keyword" }, "val": { "type": "integer" } } } } } }
注意:如果你的索引已经创建,需要重建索引修改mapping后再导入数据,已存在的普通object类型字段无法直接转为nested类型。
符合要求的查询DSL
使用nested查询指定嵌套路径,内部用bool查询组合两个条件,确保两个条件同时匹配同一个嵌套对象:
POST /你的索引名/_search { "query": { "nested": { "path": "region", "query": { "bool": { "must": [ { "term": { "region.reg": "region1" } }, { "range": { "region.val": { "gt": 2 } } } ] } } } } }
补充说明
- 上述查询只会返回
region数组中存在同时满足reg=region1且val>2的单个对象的文档,你给出的示例数据中region1对应的val是2,不会被该查询命中。 - 如需返回匹配到的具体嵌套对象,可以在
nested查询中添加"inner_hits": {}参数。
内容的提问来源于stack exchange,提问作者SergeiNotHa
相关产品推荐
相关产品推荐

