Elasticsearch查询报existing_contacts路径对象非nested类型错误求助
问题原因
你当前的memoreasecontacts索引mapping中,existing_contacts字段没有声明为nested类型,仅为默认的普通object数组类型,因此无法支持nested查询,所以触发该报错。
你更换AWS Elasticsearch域后重建索引时没有导入旧域的原始mapping配置,ES自动根据写入的数据推断字段类型,将原本的nested类型识别为了普通object类型,就是故障的根因。
修复方案
Elasticsearch不支持直接修改已有字段的类型,需要通过重建索引的方式修复,步骤如下:
- 第一步:创建新索引,指定正确的mapping,在
existing_contacts层级添加"type": "nested"声明,其余字段配置和你现有mapping保持一致即可,参考示例:
PUT /memoreasecontacts_new { "mappings": { "properties": { "existing_contacts": { "type": "nested", "properties": { // 此处复制你现有mapping中existing_contacts下的所有字段配置 "blocked_status" : { "type" : "boolean" }, // 其余字段省略,和你现有配置完全一致即可 } }, "id": { "type" : "text", "fields" : { "keyword" : { "type" : "keyword", "ignore_above" : 256 } } } // 其余顶层字段和你现有配置一致 } } }
- 第二步:执行reindex操作,将旧索引的全量数据迁移到新索引:
POST _reindex { "source": { "index": "memoreasecontacts" }, "dest": { "index": "memoreasecontacts_new" } }
- 第三步:校验新索引数据和查询功能正常后,删除旧索引,为新索引设置别名为
memoreasecontacts即可,原有业务查询代码不需要做任何修改即可正常运行。
临时替代方案
如果暂时无法重建索引,可以去掉查询语句中的nested查询结构,改为普通的bool查询。但注意该方案会改变查询语义:普通object数组的查询无法保证多条件匹配同一个数组元素,可能出现命中A元素符合friend_status: pending、B元素符合friend_owner: receiver的错误结果,仅适用于对查询准确性要求不高的临时场景。
内容的提问来源于stack exchange,提问作者M Haris
相关产品推荐
相关产品推荐

