如何创建含新字段的索引,从现有索引字段解析并拆分值?
解决方案
用Watcher不是最直接的方案,一次性完成这类拆分转储的需求,Elasticsearch的_reindex API配合Painless脚本是更高效简单的选择。以下是具体实现步骤:
1. 创建目标索引(可选)
如果目标索引还未创建,先创建和源索引结构匹配的索引(确保field1、field2的字段类型兼容):
PUT 目标索引名 { "mappings": { "properties": { "field1": {"type": "keyword"}, "field2": {"type": "keyword"} } } }
2. 执行拆分式重索引
调用_reindex API,通过Painless脚本将源文档的field2按逗号分隔拆分,生成多个目标文档:
POST _reindex { "source": { "index": "源索引名" }, "dest": { "index": "目标索引名" }, "script": { "lang": "painless", "source": """ // 按", "拆分field2的值(如果你的分隔符是纯逗号,改成','即可) List<String> field2List = ctx._source.field2.splitOnToken(', '); // 移除原field2字段 ctx._source.remove('field2'); // 遍历拆分后的每个值,生成新文档 return field2List.stream().map(val -> { def newDoc = new HashMap(ctx); newDoc._source.field2 = val.trim(); // 可选:去除值前后的空格 return newDoc; }).collect(Collectors.toList()); """ } }
关于Watcher的可行性说明
Watcher确实可以实现这个需求(比如配置定时触发的Watcher,在action中调用上述_reindex逻辑),但它更适合周期性任务或事件驱动的自动化场景。如果只是一次性完成文档拆分转储,直接用_reindex API无需额外配置Watcher,成本更低。
内容的提问来源于stack exchange,提问作者gbs
相关产品推荐
相关产品推荐

