如何查询Elasticsearch中存在非空images对象字段的记录
问题原因及解决方案
核心原因
你遇到的是Elasticsearch中object类型字段的常见查询误区:
- Elasticsearch的
object类型在索引时,仅会对其下的子字段(比如你场景中的images.path、images.is_preferred)建立索引条目,顶层images字段本身不会生成独立的索引标记 exists查询的逻辑是匹配索引中存在对应字段条目的文档,而不是匹配原始JSON(_source)里是否有该字段,所以直接查顶层images会返回0结果- 你查询单条文档能看到
images字段,是因为返回的是存储在磁盘的原始_source内容,和是否建立索引无关
排查步骤
第一步:确认字段索引配置
先执行以下命令查询索引mapping,确认images字段没有被设置为不索引:
GET /records/_mapping
如果返回的配置中images下有"index": false的配置,需要先修改mapping把该参数改为true,再重建索引数据,后续就能正常查询。
第二步:使用子字段做exists查询
如果images字段的索引配置正常,直接换成查询其下任意一个必定有值的子字段即可,比如查images.path存在的文档:
GET /records/_search { "query": { "exists": { "field": "images.path" } } }
该查询会命中所有images数组不为空、且数组内元素存在path字段的文档,和你预期的“images有值”的查询逻辑完全一致。
内容的提问来源于stack exchange,提问作者Jay
相关产品推荐
相关产品推荐

