设想一下这么一个需求:




es 热数据变温数据 es 数据预热_Elastic


后期需要对Tags做aggs统计,tags文本中,逗号分隔的文本应该是一个数组,而不是字符串

在es中可以通过ingest node实现这个需求

Ingest Node(预处理节点)是ES用于功能上命名的一种节点类型,可以通过在elasticsearch.xml进行如下配置来标识出集群中的某个节点是否是Ingest Node.

在es 5.0引入的一种新的节点类型,默认配置下每个节点都是ingest node:

1.具有预处理数据的能力,可拦截index 和 bulk api的请求

2.对数据进行转换,并重新返回给index 和 bulk api

无须使用logstash就可以进行数据的预处理,例如

1.为某个字段设置默认值,重命名某个字段的字段名,对字段进行split操作

2.支持设置painless脚本,对数据进行更加复杂的加工

总结:

可以这么说,在Elasticsearch没有提供IngestNode这一概念时,我们想对存储在Elasticsearch里的数据在存储之前进行加工处理的话,我们只能依赖Logstash或自定义插件来完成这一功能,但是在Elasticsearch 5.x版本中,官方在内部集成了部分Logstash的功能,这就是Ingest,而具有Ingest能力的节点称之为Ingest Node。

Pipeline(管道) 和 Processors (加工)

如果要脱离Logstash来对在Elasticsearch写入文档之前对文档进行加工处理,比如为文档某个字段设置默认值,重命名某个字段,设置通过脚本来完成更加复杂的加工逻辑,我们则必须要了解两个基本概念: Pipeline 和 Processors。

Pipeline - 对通过的文档按照顺序进行加工。

Processors - elasticsearch对一些加工行为进行了抽象的包装。es中有很多内置的processors也可以通过插件形式实现自己的processors。


es 热数据变温数据 es 数据预热_Elastic_02


定义一个Pipeline是件很简单的事情,官方给出了参考:

PUT _ingest/pipeline/my-pipeline-id{  "description" : "describe pipeline",  "processors" : [    {      "set" : {        "field": "foo",        "value": "bar"      }    }  ]}

上面的例子,表明通过指定的URL请求"_ingest/pipeline"定义了一个ID为"my-pipeline-id"的pipeline,其中请求体中的存在两个必须要的元素:

  • description 描述该pipeline是做什么的
  • processors 定义了一系列的processors,这里只是简单的定义了一个赋值操作,即将字段名为"foo"的字段值都设置为"bar"

简介 Simulate Pipeline API

既然Elasticsearch提供了预处理的能力,总不能是黑盒处理吧,为了让开发者更好的了解和使用预处理的方式和原理,官方也提供了相关的接口,来让我们对这些预处理操作进行测试,这些接口,官方称之为: Simulate Pipeline API。

在上面具体的例子中,我们并没有在请求URL中指定使用哪个pipeline,因此我们不得不在请求体中即时定义一个pipeline和对应的processorsPOST _ingest/pipeline/_simulate{  "pipeline" :  {    "description": "_description",    "processors": [      {        "set" : {          "field" : "foo",          "value" : "bar_new"        }      }    ]  },  "docs": [    {      "_index": "index",      "_type": "type",      "_id": "id",      "_source": {        "foo": "bar"      }    },    {      "_index": "index",      "_type": "type",      "_id": "id",      "_source": {        "foo": "rab"      }    }  ]}

在上面具体的例子中,我们并没有在请求URL中指定使用哪个pipeline,因此我们不得不在请求中即时定义一个pipeline和对应的processors。

也可以通过url指定具体pipeline来测试:

POST _ingest/pipeline/my-pipeline-id/_simulate{  "docs" : [    { "_source": {/** first document **/} },    { "_source": {/** second document **/} },    // ...  ]}


es 热数据变温数据 es 数据预热_字段_03


es 热数据变温数据 es 数据预热_预处理_04


es 热数据变温数据 es 数据预热_字段_05


es 热数据变温数据 es 数据预热_预处理_06


Logstash与ingest node比较


es 热数据变温数据 es 数据预热_字段_07


Painless介绍


es 热数据变温数据 es 数据预热_Elastic_08


es 热数据变温数据 es 数据预热_es 热数据变温数据_09


通过painless访问字段


es 热数据变温数据 es 数据预热_Elastic_10


es 热数据变温数据 es 数据预热_预处理_11


脚本缓存


es 热数据变温数据 es 数据预热_字段_12