需求再多也不能忘记学习。。
- es的ingest节点,实际上就是对es的文档索引之前做预处理
- ingest节点默认时在每个节点都开启的,所以可以在每个节点生效,也可以设置单独的节点
- ingest会拦截index、bluk请求,对请求内容做预处理,将处理完毕后的数据再转发给es,然后进行index或者bluk
- 下面举个栗子
我们先自定义一个pipeline
PUT _ingest/pipeline/my-pipeline-tag
{
"processors": [
{
"split": {
"field": "tag",
"separator": ","
}
}
],
"description": "根据tag字段中的英文逗号,将字段分隔成数组"
}
pipeline主要是由两个内容-processors和description两部分组成,我们推上去之后,再进行文档索引或者批处理时指定pipeline-id即可使用这个自定义的ingest
PUT tags/_doc/1?pipeline=my-pipeline-tag
{
"tag":"PHP,GO,JAVA,PYTHON"
}
结果
{
"_index" : "tags",
"_type" : "_doc",
"_id" : "1",
"_version" : 2,
"_seq_no" : 1,
"_primary_term" : 1,
"found" : true,
"_source" : {
"tag" : [
"PHP",
"GO",
"JAVA",
"PYTHON"
]
}
}
我来解释一下,如果不指定pipeline-id, tag字段实际上就是一个字符串,它被es索引后,展示的也将会是一个字符串的形式存储,例如
{
"_index" : "tags",
"_type" : "_doc",
"_id" : "1",
"_version" : 3,
"_seq_no" : 2,
"_primary_term" : 1,
"found" : true,
"_source" : {
"tag" : "PHP,GO,JAVA,PYTHON"
}
}
但当我们指定一个pipeline-id后,es会先拦截掉这个index请求,然后根据pipeline-id寻找对应的管道,根据管道的规则,对数据进行修改,然后再转发给index\bluk api 进行数据写入或修改,被修改的tag是按照英文逗号对这个字段进行split, 管道之后这个字段会变为一个数组,并以数组的形式存储进es