如何在Elasticsearch中编写不存在指定属性的查询?
解决方案:Elasticsearch查询不存在特定字段值的文档
首先提个小细节:你的示例数据里有几处identifer的拼写错误(少了一个字母i,正确应该是identifier),这个要注意修正,不然查询会匹配不到对应字段哦!
接下来分两种常见场景,以及不同字段类型下的查询写法:
场景1:查找没有某个特定identifier的文档
比如你想找出像_id=3这样,完全没有identifier: "product"条目的文档。
如果fields是默认的object类型
直接用bool查询结合must_not即可:
{ "query": { "bool": { "must_not": [ { "term": { "fields.identifier": "product" } } ] } } }
这个查询会返回所有不包含identifier为"product"的fields条目的文档,也就是你示例里的_id=3。
如果fields是nested类型
如果你的mapping里把fields定义成了nested类型(这种类型会把数组里的每个对象当作独立的子文档存储,避免扁平化导致的查询不准确),那必须用nested查询来包裹条件:
{ "query": { "bool": { "must_not": [ { "nested": { "path": "fields", "query": { "term": { "fields.identifier": "product" } } } } ] } } }
场景2:查找存在某个identifier,但对应的value不存在/为空的文档
比如你想找有identifier: "product"条目,但该条目的value字段为空或不存在的文档。
如果fields是默认的object类型
{ "query": { "bool": { "must": [ { "term": { "fields.identifier": "product" } } ], "must_not": [ { "exists": { "field": "fields.value" } } ] } } }
如果fields是nested类型
这里需要精准匹配到同一个子对象里的identifier和value,所以要在nested查询里嵌套bool条件:
{ "query": { "bool": { "must": [ { "nested": { "path": "fields", "query": { "term": { "fields.identifier": "product" } } } } ], "must_not": [ { "nested": { "path": "fields", "query": { "bool": { "must": [ { "term": { "fields.identifier": "product" } }, { "exists": { "field": "fields.value" } } ] } } } } ] } } }
补充说明
- 默认的
object类型会把数组中所有对象的字段扁平化存储,比如fields.identifier会变成所有条目的identifier集合,这种情况下简单的term查询就能生效,但如果你的文档里有多个同identifier的条目,可能会有歧义; nested类型则会为数组里的每个对象创建独立的索引,查询时必须用nested查询来定位到具体的子对象,结果更精准,适合复杂的嵌套数组场景。
内容的提问来源于stack exchange,提问作者hash12
相关产品推荐
相关产品推荐

