Kibana中如何通过ingest pipeline用|分割字段并应用到现有索引
问题原因与解决方法
1. 竖线分隔符拆分异常问题
原因
Elasticsearch的split处理器的separator参数默认按正则表达式解析,|在正则中是特殊字符,代表「或」逻辑,单独写"separator": "|"等价于匹配空字符,所以会把字符串拆成单个字符。
你之前写"separator": "\|"报错的原因有两个:
- JSON语法中反斜杠本身需要转义,单个
\会被JSON解析器直接吃掉,实际传给split处理器的还是| - 你拆分后数组下标用错了:ES数组下标从0开始计数,你拆分后只有2个元素,对应下标是
0和1,你写dv_m_splited.2自然会报数组越界错误
正确配置
把分隔符改成双反斜杠转义的\\|,同时修正数组下标即可,示例如下:
POST _ingest/pipeline/_simulate { "pipeline": { "description": """combined fields are text that contain "|" to separate two fields""", "processors": [ { "split": { "field": "dv_m", "separator": "\\|", "target_field": "dv_m_splited" } }, { "set": { "field": "dv_metric_prod", "value": "{{dv_m_splited.0}}", "override": false } }, { "set": { "field": "dv_metric_section", "value": "{{dv_m_splited.1}}", "override": false } } ] }, "docs": [ { "_source": { "dv_m": "amaze_inc|Understanding" } } ] }
执行后会正常拆分出两个预期字段。
2. 把pipeline应用到已有索引的方法
首先先将你调试好的pipeline正式创建到集群中,替换成你自己的pipeline名称:
PUT _ingest/pipeline/split_dv_m_pipeline { "description": "拆分dv_m字段为prod和section", "processors": [ // 上面调试好的处理器配置直接复制过来 ] }
之后有两种常用方案应用到已有数据:
方案1:原地更新已有数据(推荐不需要重建索引的场景)
使用update_by_query对索引全量数据执行pipeline处理:
POST 你的索引名称/_update_by_query?pipeline=split_dv_m_pipeline { "query": { "exists": {"field": "dv_m"} // 只处理存在dv_m字段的文档,避免报错 } }
如果数据量较大,可以加wait_for_completion=false参数异步执行,后台自动跑完。
方案2:重建索引(推荐需要同时修改mapping等场景)
如果需要重建索引,用reindex指定pipeline即可:
POST _reindex { "source": {"index": "旧索引名称"}, "dest": { "index": "新索引名称", "pipeline": "split_dv_m_pipeline" } }
之前方案不生效的常见原因
- pipeline配置错误(比如之前的分隔符、下标问题导致执行报错,跳过了更新)
- 执行update_by_query/reindex时没有指定正确的pipeline名称
- 字段不存在、或格式不符合预期导致pipeline执行失败,可加上
ignore_failure: true参数在split处理器中避免阻塞流程。
内容的提问来源于stack exchange,提问作者YNR
相关产品推荐
相关产品推荐

