Elasticsearch reindex脚本生效但管道script处理器报错问题咨询
问题根因
两种脚本执行场景下ctx._index的取值逻辑完全不同,这是报错的核心原因:
- 直接在reindex请求体中携带Painless脚本时,脚本运行在reindex的源文档读取阶段,此时
ctx._index读取的是源索引的完整名称,你的substring截取逻辑是基于源索引长度编写的,所以运行正常。 - 脚本迁移到ingest pipeline后,pipeline运行在reindex的目标文档写入预处理阶段,此时
ctx._index的默认取值是你在reindex请求dest.index参数中填写的目标索引名,而非源索引名。你还是按照源索引的长度做substring截取,而此时ctx._index的长度远小于预期,就会抛出越界异常:你收到的报错begin 16, end 6, length 6就说明当前ctx._index总长度只有6位,你尝试从第16位开始截取,自然触发错误。
解决方案
你需要在reindex阶段把源索引名作为临时字段传递给ingest pipeline,调整步骤如下:
1. 修改ingest pipeline的script处理器逻辑
放弃直接读取ctx._index,改为读取自定义传递的源索引字段,示例pipeline配置:
{ "processors": [ { "script": { "source": """ // 校验传递过来的源索引字段是否存在 if (ctx.containsKey('source_index')) { // 对源索引做substring截取,逻辑和你之前保持一致 String index_suffix = ctx.source_index.substring(16); // 原有projectId拼接逻辑不变 if (ctx.containsKey('kubernetes') && ctx.kubernetes.containsKey('namespace_labels') && ctx.kubernetes.namespace_labels.containsKey('field_cattle_io/projectId')) { String projectId = ctx.kubernetes.namespace_labels['field_cattle_io/projectId']; ctx._index = 'project-' + projectId + '-' + index_suffix; } // 删除临时字段,避免写入最终文档 ctx.remove('source_index'); } """ } } ] }
2. 调整reindex请求,传递源索引到pipeline
POST _reindex { "source": { "index": "你的源索引通配符" }, "dest": { "index": "dummy-temp-index", // 该索引仅做占位,最终会被pipeline逻辑覆盖 "pipeline": "你编写的ingest pipeline名称" }, // 新增script传递源索引名到文档临时字段 "script": { "source": "ctx['source_index'] = ctx._index" } }
调整后即可保持原有逻辑正常运行,不会再出现字符串越界错误。
内容的提问来源于stack exchange,提问作者Mohamed
相关产品推荐
相关产品推荐

