提供写入的数据少于指定的数据_elastic 数据预处理、修复与增强写入的数据

设想一下这么一个需求:

2c4ca6ac40db3828032c7aa85fd71c15.png

后期需要对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。

71bc30063dd1ebb80b996cea54ca0184.png

定义一个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 **/} },    // ...  ]}
cb523f3f664e01145a1999b682c856a7.png
4bf861eafcb01b24c5f19d0fa9a16bf2.png
aacf9bf2dbf622f4340b0d17a9ec0e09.png
47df42b7a442bbebe344cb5142243e73.png

Logstash与ingest node比较

c94fc6699c0e645ae9da750698b78943.png

Painless介绍

9ff2e297da6d2fb2414c45da84677b91.png
52d358e1d34499b5ac311ccf1aba910b.png

通过painless访问字段

fa51617355e1e39ae3d9353c77aa235e.png
d7d6f659a976183c2d2343b2b7d27b97.png

脚本缓存

10834ae553284807b476a7aec496824c.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好,C知道在这里,我可以帮助您解决Elasticsearch数据无法写入的问题。以下是一些可能的原因和解决方法: 1. 确认索引是否存在:在写入数据之前,确保您要写入的索引已经存在。如果不存在,您可以使用Elasticsearch的索引API来创建索引。 2. 检查集群健康状态:使用Elasticsearch的健康检查API(/_cluster/health)来确认集群的健康状态。如果集群处于黄色或红色状态,可能会导致数据写入失败。您可以根据返回的错误信息来诊断和解决问题。 3. 检查文档ID:在写入数据时,确保指定了唯一的文档ID。如果指定的文档ID已经存在,将会更新该文档而不是创建新的文档。如果没有指定文档ID,Elasticsearch将自动生成一个唯一的ID。 4. 检查索引设置:确保您的索引设置允许写入操作。您可以使用Elasticsearch的索引设置API(/_settings)来检查和修改索引的设置。 5. 检查文档映射:确保您的索引映射允许写入操作。如果映射中某个字段不允许写入,那么写入操作将会失败。您可以使用Elasticsearch的索引映射API(/_mapping)来检查和修改索引的映射。 6. 检查存储空间:确保您的Elasticsearch集群有足够的存储空间来存储新的数据。如果磁盘空间已满,写入操作将会失败。 如果您仍然遇到问题,请提供更多的信息,例如错误消息、Elasticsearch版本以及相关的配置信息,以便更好地帮助您解决问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值