Elasticsearch中match查询指定对象路径不存在时的行为问询
Elasticsearch中匹配不存在的对象属性时的查询行为
这个问题我之前刚好碰到过,给你理清楚Elasticsearch的处理逻辑:
当你在must子句里使用match查询"parentObj.obj.property": "Foo"时,如果某篇文档里完全没有parentObj.obj这个对象层级(也就是obj根本不存在),那这篇文档会被直接排除在查询结果之外。
原因很简单:Elasticsearch在处理这类字段查询时,会先检查目标字段是否存在。对于根本没有obj的文档,parentObj.obj.property这个字段相当于不存在,match查询找不到任何符合"Foo"的匹配项,而must子句要求所有条件都必须满足,所以这类文档会被过滤掉。
举个直观的例子:
- 文档A:包含
"parentObj": {"obj": {"property": "Foo"}}→ 会被匹配到 - 文档B:包含
"parentObj": {"obj": {"property": "Bar"}}→ 不会被匹配到 - 文档C:只有
"parentObj": {}(没有obj)→ 会被排除 - 文档D:连
parentObj都没有 → 同样会被排除
如果你的需求是同时保留那些不含obj的文档,可以用bool查询结合should和must_not来实现,示例如下:
{ "query": { "bool": { "should": [ { "match": { "parentObj.obj.property": "Foo" } }, { "bool": { "must_not": { "exists": { "field": "parentObj.obj" } } } } ], "minimum_should_match": 1 } } }
这个查询会返回所有满足「property是Foo」或者「根本没有obj」的文档。
内容的提问来源于stack exchange,提问作者bohkoval
相关产品推荐
相关产品推荐

