Elasticsearch: Ingest pipelines学习

1. Ingest pipelines说明

  1. Ingest pipelines可以在写入数据之前执行一些常见的数据转换。比如说,你可以使用pipelines去移除字段、从文本中提取数据、还可以去丰富你的数据
  2. 一个pipeline由一系列可配置的processor处理器组成,每个processor按照顺序运行,让传入的文档进行指定的改变,处理器运行之后,elasticsearch添加转换后的文档到你的数据流或者索引中
    在这里插入图片描述

2. 创建和管理pipelines

  1. 可以在kibana中,主菜单下 Stack Management > Ingest Node Pipelines中可以管理pipelines
  2. 可以使用命令行api去创建和管理pipelines

2.1 命令行创建pipelines(append、set、split、trim、sort)

此处举例创建一个名字为my-pipeline的管道
(1)append:如果这个字段存在并且它是一个数组,那么将会添加一个或多个values给一个已经存在的数组;如果这个字段不存在,那么就会创建一个包含这些值的数组。注意{{{ }}}可以动态取出文档中的字段值
(2)set:设置一个字段为指定值(如果该字段已经存在,则该字段值将会被替换)
(3)split:将字符串按照分隔符分隔成为一个数组
(4)trim:去除空白符。如果这个字段是字符串数组,那么里面所有的元素都会被trim
(5)sort:数组元素asc或desc排序

#创建管道
PUT /_ingest/pipeline/my-pipeline
{
  "description": "mt pipeline test",
  "processors": [
    {
      "append": {
        "field": "extendParams.appendParam",
        "value": "appendValue"
      }
    },
    {
      "set": {
        "field": "typeName",
        "value": "电影",
        "if": " ctx.type==1"
      }
    },
    {
      "set": {
        "field": "typeName",
        "value": "电视剧",
        "if": " ctx.type==2"
      }
    },
    {
      "split": {
        "field": "tags",
        "separator": ","
      }
    },
    {
      "trim": {
        "field": "tags"
      }
    },
    {
      "append": {
        "field": "extendParams.nameAndTagsParam",
        "value": [
          "aa",
          "{{{name}}}",
          "{{{typeName}}}"
        ]
      }
    },
    {
      "sort": {
        "field": "weight",
        "order": "desc"
      }
    }
  ]
}
# 使用管道添加数据
PUT /my-pipeline-index/_doc/1?pipeline=my-pipeline
{
  "id":1,
  "name":"战狼",
  "type": 1,
  "tags":"动作 , 爱情 ,爱国 ,,,",
  "weight":[1,5,3,7,2,8,0]
}
# 最终结果
{
  ...
  "hits" : {
	...
    "hits" : [
      {
        "_index" : "my-pipeline-index",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "extendParams" : {
            "nameAndTagsParam" : [
              "aa",
              "战狼",
              "电影"
            ],
            "appendParam" : [
              "appendValue"
            ]
          },
          "name" : "战狼",
          "typeName" : "电影",
          "weight" : [
            8,
            7,
            5,
            3,
            2,
            1,
            0
          ],
          "id" : 1,
          "type" : 1,
          "tags" : [
            "动作",
            "爱情",
            "爱国"
          ]
        }
      }
    ]
  }
}

2.2 enrich process

可以使用enrich processor从已经存在的索引中添加数据给传入的相关文档

2.2.1 enrich processor工作原理

在这里插入图片描述

  1. enrich policy
    是一套用来给传入文档添加正确的丰富数据的配置选项
    一个enrich policy包括:
    (1)一个或多个源索引(存储丰富数据)
    (2)策略类型(决定处理器如何匹配填充数据与传入文档)
    (3)源索引中用来匹配传入文档的字段
    (4)源索引中你想要添加给传入文档的填充数据字段
  2. source index
    源索引
    存储要添加到传入文档中的丰富数据的索引
  3. enrich index
    (1)将传入文档与源索引直接匹配的效率是低下的,为了提升速度,enrich processor会使用enrich index
    (2)enrich index包含来自源索引的丰富数据,但具有一些特殊属性来帮助简化它们:
			 (a) 它们是系统索引,意味着它们由es内部管理,仅仅使用在enrich processors
			 (b) 它们总是以.enrich-*开头
			 (c)  它们是只读的
			 (d) 它们被强制合并为了快速检索

2.2.2 enrich 举例(基于精确值)

  1. 文档创建
PUT /users/_doc/1?refresh=wait_for
{
  "email": "mardy.brown@asciidocsmith.com",
  "first_name": "Mardy",
  "last_name": "Brown",
  "city": "New Orleans",
  "county": "Orleans",
  "state": "LA",
  "zip": 70116,
  "web": "mardy.asciidocsmith.com"
}
  1. 使用create enrich policy API创建一个match类型的enrich policy,这个策略必须包括:
    (1)一个或多个源索引
    (2)一个匹配字段,该字段来自源索引,用来匹配传入文档
    (3)想要从源索引添加给传入文档的丰富数据字段
PUT /_enrich/policy/users-policy
{
  "match": {
    "indices": "users",
    "match_field": "email",
    "enrich_fields": ["first_name", "last_name", "city", "zip", "state"]
  }
}
  1. 使用 execute enrich policy API去创建一个丰富索引
POST /_enrich/policy/users-policy/_execute
  1. 使用创建pipeline api去创建ingest pipeline,在这个pipeline中,添加一个enrich processor,包括:
    (1)enrich policy
    (2)field:传入文档中用来匹配enrich index文档的字段
    (3)target_field:用为传入文档存储填充数据。这个字段包含enrich policy中指定的match_field、enrich_fields
PUT /_ingest/pipeline/user_lookup
{
  "processors" : [
    {
      "enrich" : {
        "description": "Add 'user' data based on 'email'",
        "policy_name": "users-policy",
        "field" : "email",
        "target_field": "user",
        "max_matches": "1"
      }
    }
  ]
}
  1. 验证、结果

使用上面创建的pipeline,添加文档

PUT /my-index-000001/_doc/my_id?pipeline=user_lookup
{
  "email": "mardy.brown@asciidocsmith.com"
}

查看这个文档

GET /my-index-000001/_doc/my_id

结果

{
  "found": true,
  "_index": "my-index-000001",
  "_type": "_doc",
  "_id": "my_id",
  "_version": 1,
  "_seq_no": 55,
  "_primary_term": 1,
  "_source": {
    "user": {
      "email": "mardy.brown@asciidocsmith.com",
      "first_name": "Mardy",
      "last_name": "Brown",
      "zip": 70116,
      "city": "New Orleans",
      "state": "LA"
    },
    "email": "mardy.brown@asciidocsmith.com"
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值