Elasticsearch嵌套字段过滤异常:门店1非指定日期数据未命中
嵌套对象数组过滤问题解决方案
问题根因
你的查询没正确处理txn_info这个嵌套对象数组的关联过滤——ES默认会把嵌套数组扁平化,导致门店编号和交易日期的条件是独立判断的,不是针对同一个txn_info元素做组合匹配,这才出现了不符合预期的结果。
正确查询写法
用Elasticsearch的nested查询来绑定两个条件,确保只匹配同一个txn_info元素里门店编号为1,且该元素交易日期不在2023-01-27至2023-07-27区间的文档:
{ "query": { "nested": { "path": "txn_info", "query": { "bool": { "must": [ { "term": { "txn_info.store_id": 1 } }, { "bool": { "must_not": [ { "range": { "txn_info.txn_date": { "gte": "2023-01-27", "lte": "2023-07-27" } } } ] } } ] } }, "inner_hits": {} // 可选,用来返回匹配的嵌套元素详情 } } }
额外场景说明
如果你的需求是文档里所有门店1的交易日期都不在指定区间,而不是只要存在一个符合条件的,就用下面的查询:
{ "query": { "bool": { "must": [ // 确保文档里至少有一个门店1的交易 { "nested": { "path": "txn_info", "query": { "term": { "txn_info.store_id": 1 } } } } ], "must_not": [ // 排除掉存在门店1且交易日期在区间内的文档 { "nested": { "path": "txn_info", "query": { "bool": { "must": [ { "term": { "txn_info.store_id": 1 } }, { "range": { "txn_info.txn_date": { "gte": "2023-01-27", "lte": "2023-07-27" } } } ] } } } } ] } } }
内容的提问来源于stack exchange,提问作者Kaushik R
相关产品推荐
相关产品推荐

