如何用ElasticSearch查询筛选tiers.floor=1且flatAmount>0的文档?
实现ElasticSearch文档筛选需求:匹配特定tiers子项
可以实现该需求,但需要注意tiers字段的映射类型,避免跨数组元素的误匹配问题。
关键前提
默认情况下,ElasticSearch会把数组类型的object字段扁平化存储,这意味着如果直接用普通布尔查询,可能会错误匹配到不同子项分别满足条件的文档(比如一个子项floor=1,另一个子项flatAmount>0,文档会被误命中)。因此需要将tiers字段设置为nested类型,确保查询条件作用于同一个子对象。
步骤1:设置nested字段映射(若未配置)
如果你的索引还未将tiers设为nested类型,先执行以下命令修改映射:
PUT /你的索引名/_mapping { "properties": { "tiers": { "type": "nested" } } }
步骤2:编写查询语句
使用nested查询精准匹配同一tiers子项的两个条件:
GET /你的索引名/_search { "query": { "nested": { "path": "tiers", "query": { "bool": { "must": [ { "term": { "tiers.floor": 1 } }, { "range": { "tiers.flatAmount": { "gt": 0 } } } ] } }, "inner_hits": { // 可选,返回匹配的具体tiers子项,便于验证结果 "size": 10 } } } }
说明
nested查询会逐一检查每个tiers子对象,只有当同一个子对象同时满足floor=1和flatAmount>0时,才会命中整个文档。inner_hits是可选参数,用来返回文档中符合条件的具体子项,方便你确认匹配结果是否正确。
内容的提问来源于stack exchange,提问作者Abhishek Ranjan
相关产品推荐
相关产品推荐

