Elasticsearch 1.7.1使用_delete_by_query报错排查求助
嘿,咱们来一步步拆解你碰到的这个问题:你用ES 1.7.1的_delete_by_query删数据时,所有索引都报了动态映射禁用的错,但单个索引明明开了dynamic: true,而且相同的查询在_search里能正常返回600条结果,这确实有点让人困惑。
问题根源
首先得明确:Elasticsearch 1.7.1里的_delete_by_query不是核心API,它是一个独立插件。这个插件在执行删除任务时,会自动尝试创建一个专门用来存储任务状态的特殊索引(一般命名为.delete_by_query)。
如果你的ES集群全局设置了index.dynamic: false(也就是全局禁用了动态映射),那插件自动创建这个任务索引的映射时就会失败——毕竟全局规则优先,哪怕你的业务索引自己开了动态映射,也管不到这个插件要创建的新索引。这就是你看到报错:
[[_delete_by_query, trying to auto create mapping, but dynamic mapping is disabled]] missing]
的核心原因。
可行的解决方案
方案1:提前创建任务索引并配置映射
最稳妥的办法是手动创建插件需要的任务索引,并且给它开启动态映射:
PUT /.delete_by_query { "mappings": { "default": { "dynamic": "true", "properties": { "task_id": {"type": "string", "index": "not_analyzed"}, "status": {"type": "string", "index": "not_analyzed"}, "total": {"type": "long"}, "deleted": {"type": "long"}, "batch_size": {"type": "long"}, "start_time": {"type": "date"} } } } }
创建好这个索引后,再执行你的_delete_by_query请求,就不会再触发自动创建映射的报错了。
方案2:临时调整全局动态映射(不推荐)
如果实在没办法提前创建索引,可以临时打开集群的全局动态映射,执行完删除后再关闭——但这个操作会影响整个集群的索引行为,可能导致意外的自动映射创建,所以谨慎使用:
# 临时开启全局动态映射 PUT /_cluster/settings { "persistent": { "index.dynamic": "true" } } # 执行删除请求(注意修正字段路径) POST /composite_task_group/stock_take/_delete_by_query { "query": { "query_string": { "query": "A", "default_field": "data.facility_id" } } } # 恢复全局动态映射设置 PUT /_cluster/settings { "persistent": { "index.dynamic": "false" } }
小提示:修正查询字段路径
另外看你的索引映射,facility_id是嵌套在data字段下的,所以你的查询里default_field应该写data.facility_id而不是facility_id——虽然你说_search能返回结果,但可能是ES的字段自动匹配机制起了作用,修正路径能让查询更精准,避免误删其他数据。
内容的提问来源于stack exchange,提问作者Vishakha Lall

