【橘子ES】实战操作之管道类型Ingest pipelines的基本使用

简介

我们在使用ES的时候,经常的用法就是把其他数据源比如Mysql的数据灌到ES中。
借用ES的一些功能来提供数据的全文检索以及聚合分析之类的功能。
在这个灌数据的过程中,我们经常会对数据做一些治理,类似ETL的能力。然后把治理后的数据写入ES中。
我们当然可以自己监听MQ的数据在程序中编写代码来实现这个过程。
也可以使用logstash等中间件来实现这个功能。
这些都可以。但是ES中本身也是提供了一个能力来实现这个功能的。
而且基于这个能力你甚至可以扩展出其他的操作。
这个能力就是Ingest pipelines(摄取管道)。

这个系列我们就来看一下摄取管道的能力,并且我会分三个章节来完成。这个章节我们只来看一些他的基本用法,后面我们会依次讲解 enrich processor和自己开发插件实现管道。

一、什么是Ingest pipelines(摄取管道)

我们先来看官方文档的一些信息。本文使用的ES版本为7.17.7。官方文档的位置位于Ingest pipelines官方文档

# 英文:
Ingest pipelines let you perform common transformations on your data before indexing.
For example, you can use pipelines to remove fields, extract values from text, and enrich your data.

A pipeline consists of a series of configurable tasks called processors. 
Each processor runs sequentially, making specific changes to incoming documents. 
After the processors have run, Elasticsearch adds the transformed documents to your data stream or index.

# 中文:
采集管道可让您在索引之前对数据执行常见的转换。例如,您可以使用管道删除字段、从文本中提取值以及丰富数据。
管道由一系列可配置的任务(称为处理器)组成。每个处理器按顺序运行,对传入的文档进行特定更改。
处理器运行后,Elasticsearch 会将转换后的文档添加到您的数据流或索引中。

而且官方还有一个图示:
在这里插入图片描述
我们从描述和图示可以看到他很像我们在设计模式中说的责任链设计模式,把一个数据从源端拿到之后,在写入目标端的索引之前,经过一系列的processor处理器,最终得到目标数据,写入ES索引中。
实际上他也就是这个功能。

而且你可以使用 Kibana 的摄取管道功能或摄取 API 创建和管理摄取管道。 Elasticsearch 将管道存储在集群状态中。我们说,基本上ES中的一些操作你都可以通过kibana界面或者是DSL命令来实现。他们是等价的,只是一个有界面点点点,一个是写代码。作为一个开发,我们当然要用命令这种"高大上"的东西来实现了,界面点点点还是让那些小白去点吧,没有任何逼格。
而且命令的官方地址位于Ingest pipelines操作命令
并且我们说这个管道你建立之后,如果你想查看,你可以去集群状态中去查看,具体的操作步骤位于ES查看集群状态

OK,至此我们已经知道了他的一些概念,以及如何去在文档中定位他。下面我们就来看看如何使用。

二、Ingest pipelines基本步骤

1、节点角色

这个后面我会单独写一篇文章来说这个事,这里先提一下,如果你想使用Ingest pipelines功能。要求你的节点角色必须是Ingest,我们这次不纠结这个,因为所有的节点启动默认就有这个角色。我们这次的重点不在节点角色上。
所以我们这个问题目前不存在。

2、操作步骤

我们先来看看他的操作流程,然后我们再探究那些深入的。

2.1、创建一个索引,写入数据

我们先创建一个索引用于操作。

# 我们创建一个索引,他有两个字段,一个是text类型的message,一个是类似数组类型的tags,
# 这里之所以说类似数组,是因为ES没有专门的数组类型,这个我们后面说。
PUT my-index-01
{
   
   
  "settings": {
   
   
    "number_of_replicas": 0 # 我是单节点,设置副本为0,
  }, 
  "mappings": {
   
   
    "properties": {
   
   
      "message":{
   
   
        "type": "text"
      },
      "tags":{
   
   
        "type": "keyword"
      }
    }
  }
}

# 然后往里写两条数据
PUT my-index-01/_doc/1
{
   
   
  "message": "手机",
  "tags":  [ "xiao mi ", " hua wei" ]
}

PUT my-index-01/_doc/2
{
   
   
  "message": "语言",
  "tags":  [ "java ", " python" ]
}

# 查到此时的数据为,我们看到数据没毛病
GET my-index-01/_search
{
   
   
  "_index" : "my-index-01",
  "_type" : "_doc",
  "_id" : "1",
  "_score" : 1.0,
  "_source" : {
   
   
    "message" : "手机",
    "tags" : [
      "xiao mi ",
      " hua wei"
    ]
  }
},
{
   
   
  "_index" : "my-index-01",
  "_type" : "_doc",
  "_id" : "2",
  "_score" : 1.0,
  "_source" : {
   
   
    "message" : "语言",
    "tags" : [
      "java ",
      " python"
    ]
  }
}

但是我们发现,我写进去的数据的tags字段,有的是后面有空格,有的是前面有空格,反正就是对不上。所以我们要把他处理掉。

2.2、创建摄取管道


PUT _ingest/pipeline/my-pipeline-01
{
   
   
  "description": "我的第一个pipeline",
  "processors": [
    {
   
   
      "foreach": {
   
   
        "field": "tags",
        "processor": {
   
   
          "trim": {
   
   
            "field": "_ingest._value"
          }
        }
      }
    }
  ]
}

我们看到我创建了一个摄取管道,其中processors部分可以传入多个processor,如同我们前面说的责任链。这里每一个processor都是责任链中的一个处理节点。
我们加入了第一个processor叫做foreach,用来遍历我们的每一条数据的每一个tags字段,然后他又嵌套了一个processor叫做trim,就是对于每个tags的遍历的属性都做去除前后空格的操作,trim在java也常见。而_ingest._value是固定写法,表示的就是每一个tags中的元素。取出来做trim。
这就是一个摄取管道的最基本的要素。
这个DSL如果你觉得抽象,我可以用java伪代码来表示一下。其实就干了这么点事。

public static void main(String[] args) {
   
   
    List<MyIndex01> list = Arrays.asList(
            new MyIndex01("手机", Arrays.asList("xiao mi ", " hua wei")), 
            new MyIndex01("语言", Arrays.asList("java ", " python"))
    );
    for (MyIndex01 myIndex01 : list) {
   
   
        List<String> tags = new ArrayList<>();
        for (String tag : myIndex01.getTags()) {
   
   
            tags.add(tag.trim());
        }
        myIndex01.setTags(tags);
    }
}

@Data
@AllArgsConstructor
@NoArgsConstructor
static class MyIndex01 {
   
   
    private String message;
    private List<String> tags;

}

2.2、创建一个目标索引

我们创建目标索引用来清洗我们的数据之后存进去。其实和源索引一样。

PUT my-index-01_target
{
   
   
  "settings": {
   
   
    "number_of_replicas": 0
  }, 
  "mappings": {
   
   
    "properties": {
   
   
      "message":{
   
   
        "type": "text"
      },
      "tags":{
   
   
        "type": "keyword"
      }
    }
  }
}

2.3、pipeline+reindex清洗数据

下面我们就执行reindex把我们源端索引的带着空格的不合理的数据,通过摄取管道,转换到目标索引中。

POST _reindex
{
   
   
  "source": {
   
    
    "index": "my-index-01"
  },
  "dest": {
   
   
    "index": "my-index-01_target",
    "pipeline": "my-pipeline-01"  # 在这里指定我们的摄取管道。
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值