转载自:https://blog.csdn.net/UbuntuTouch/article/details/108621206

foreach processor 用于处理未知长度数组中的元素。这个有点和我们在编程中使用的循环是一样的。

所有处理器都可以对数组内的元素进行操作,但是如果需要以相同的方式处理数组中的所有元素,则为每个元素定义处理器将变得既麻烦又棘手,因为数组中元素的数量可能未知。因此,存在 foreach 处理器。通过指定包含数组元素的字段和定义每个元素应该发生什么的处理器,可以轻松地预处理数组字段。

foreach 处理器内部的处理器在数组元素上下文中工作,并将其放在 _ingest._value 键下的摄取元数据中。如果 array 元素是 json 对象,则它将保存该 json 对象的所有字段。如果嵌套对象是一个值,则 _ingest._value 仅保留该值。请注意,如果在 foreach 处理器之前的处理器使用 _ingest._value 键,则指定的值将不可用于 foreach 处理器内部的处理器。 foreach 处理器确实会恢复原始值,因此该值可在 foreach 处理器之后供处理器使用。

请注意,文档中的其他任何字段都可以像其他所有处理器一样进行访问和修改。该处理器只是将当前正在读取的数组元素放入_ingest._value 摄取元数据属性中,以便对其进行预处理。

如果 foreach 处理器无法处理数组中的元素,并且未指定 on_failure 处理器,则它将中止执行并保留数组不变。

例子

假如我们导入如下的两个文件到索引 my_index 中:

  1. PUT my_index/_doc/1
  2. {
  3. "tags": "Movies,Beauty,Music,food"
  4. }
  5. PUT my_index/_doc/2
  6. {
  7. "tags": ""
  8. }

在上面,我们包含有两种类型的文档:一种是一个字符串组成的标签,另外一种是标签为空。这个好比针对一些应用对视频进行画像。通过这样的标签,我们可以对视频进行分类,以便以后进行搜索。

针对 tags 为空的情况,我们想为它设置默认的分类,比如 Music。为此,我们设计如下的 ingest pipeline:

  1. PUT _ingest/pipeline/my_pipeline
  2. {
  3. "processors": [
  4. {
  5. "set": {
  6. "if": "ctx['tags'].empty",
  7. "field": "tags",
  8. "value": "Music"
  9. }
  10. }
  11. ]
  12. }

在上面,我们使用了 "if" 条件来检查 tags 是否为空,如果为空,那么设置默认的 tags 为 Music。运行上面的 pipeline:

我们可以通过如下的方法来进行测试:

  1. POST _ingest/pipeline/my_pipeline/_simulate
  2. {
  3. "docs": [
  4. {
  5. "_source": {
  6. "tags": "Movies,Beauty,Music,Food"
  7. }
  8. },
  9. {
  10. "_source":{
  11. "tags": ""
  12. }
  13. }
  14. ]
  15. }

运行上面的测试文档:

  1. {
  2. "docs" : [
  3. {
  4. "doc" : {
  5. "_index" : "_index",
  6. "_type" : "_doc",
  7. "_id" : "_id",
  8. "_source" : {
  9. "tags" : "Movies,Beauty,Music,Food"
  10. },
  11. "_ingest" : {
  12. "timestamp" : "2020-09-16T06:55:36.657202Z"
  13. }
  14. }
  15. },
  16. {
  17. "doc" : {
  18. "_index" : "_index",
  19. "_type" : "_doc",
  20. "_id" : "_id",
  21. "_source" : {
  22. "tags" : "Music"
  23. },
  24. "_ingest" : {
  25. "timestamp" : "2020-09-16T06:55:36.657205Z"
  26. }
  27. }
  28. }
  29. ]
  30. }

我们可以看到针对 tags 为空的文档,tags 变为 Music。

接下来,我们想对 tags 进行拆分,让它变为数组,这样更便于搜索。我们使用 split processor:

  1. PUT _ingest/pipeline/my_pipeline
  2. {
  3. "processors": [
  4. {
  5. "set": {
  6. "if": "ctx['tags'].empty",
  7. "field": "tags",
  8. "value": "Music"
  9. }
  10. },
  11. {
  12. "split": {
  13. "if": "!(ctx['tags'].empty)",
  14. "field": "tags",
  15. "separator": ","
  16. }
  17. }
  18. ]
  19. }

上面的 split processor 以逗号分开上面的字符串,并形成数组。运行上面的 pipepline,并以上面的测试文档进行测试:

  1. {
  2. "docs" : [
  3. {
  4. "doc" : {
  5. "_index" : "_index",
  6. "_type" : "_doc",
  7. "_id" : "_id",
  8. "_source" : {
  9. "tags" : [
  10. "Movies",
  11. "Beauty",
  12. "Music",
  13. "Food"
  14. ]
  15. },
  16. "_ingest" : {
  17. "timestamp" : "2020-09-16T06:58:51.956573Z"
  18. }
  19. }
  20. },
  21. {
  22. "doc" : {
  23. "_index" : "_index",
  24. "_type" : "_doc",
  25. "_id" : "_id",
  26. "_source" : {
  27. "tags" : [
  28. "Music"
  29. ]
  30. },
  31. "_ingest" : {
  32. "timestamp" : "2020-09-16T06:58:51.956577Z"
  33. }
  34. }
  35. }
  36. ]
  37. }

从上面我们可以看出来,tags 现在变成为数组了。但是,我们发现,上面的第一个字母都是大写,可能我们都觉得不是很爽。我们可以使用 foreach processor 来把每个单词变为小写的。我们进一步改造为:

  1. PUT _ingest/pipeline/my_pipeline
  2. {
  3. "processors": [
  4. {
  5. "set": {
  6. "if": "ctx['tags'].empty",
  7. "field": "tags",
  8. "value": "Music"
  9. }
  10. },
  11. {
  12. "split": {
  13. "if": "!(ctx['tags'].empty)",
  14. "field": "tags",
  15. "separator": ","
  16. }
  17. },
  18. {
  19. "foreach": {
  20. "if": "!ctx['tags'].empty",
  21. "field": "tags",
  22. "processor": {
  23. "lowercase": {
  24. "field": "_ingest._value"
  25. }
  26. }
  27. }
  28. }
  29. ]
  30. }

在上面,我们使用 foreach processor 来遍历 tags 里的所有字符串。在里面我们使用了 lowercase 这个 processor 来把所有的字母变为小写。运行上面的 pipeline,并以上面的文档来进行测试:

  1. {
  2. "docs" : [
  3. {
  4. "doc" : {
  5. "_index" : "_index",
  6. "_type" : "_doc",
  7. "_id" : "_id",
  8. "_source" : {
  9. "tags" : [
  10. "movies",
  11. "beauty",
  12. "music",
  13. "food"
  14. ]
  15. },
  16. "_ingest" : {
  17. "_value" : null,
  18. "timestamp" : "2020-09-16T07:02:32.963724Z"
  19. }
  20. }
  21. },
  22. {
  23. "doc" : {
  24. "_index" : "_index",
  25. "_type" : "_doc",
  26. "_id" : "_id",
  27. "_source" : {
  28. "tags" : [
  29. "music"
  30. ]
  31. },
  32. "_ingest" : {
  33. "_value" : null,
  34. "timestamp" : "2020-09-16T07:02:32.963728Z"
  35. }
  36. }
  37. }
  38. ]
  39. }

这一次,我们看到了所有的在 tags 里的字母都变为小写的字母了。

Elasticsearch:foreach 摄入处理器介绍---处理未知长度数组中的元素的更多相关文章

  1. java中的foreach输出数组中的元素

    public class forEach { public static void main(String[]args){ String [] hobby = {"imooc",& ...

  2. PHP删除数组中空值的方法介绍

    这篇文章主要介绍了PHP删除数组中空值的方法介绍,需要的朋友可以参考下 说来惭愧,以前在去掉数组的空值是都是强写foreach或者while的,利用这两个语法结构来删除数组中的空元素,简单代码如下: ...

  3. js数组中的find(), findIndex(), filter(), forEach(), some(), every(), map(), reduce()方法的详解和应用实例

    1. find()与findIndex() find()方法,用于找出第一个符合条件的数组成员.它的参数是一个回调函数,所有数组成员依次执行该回调函数,直到找出第一个返回值为true的成员,然后返回该 ...

  4. 数组中的forEach和map的区别

    大多数情况下,我们都要对数组进行遍历,然后经常用到的两个方法就是forEach和map方法. 先来说说它们的共同点 相同点 都是循环遍历数组中的每一项 forEach和map方法里每次执行匿名函数都支 ...

  5. (转载)js数组中的find、filter、forEach、map四个方法的详解和应用实例

    数组中的find.filter.forEach.map四个语法很相近,为了方便记忆,真正的掌握它们的用法,所以就把它们总结在一起喽. find():返回通过测试的数组的第一个元素的值 在第一次调用 c ...

  6. MyBatis:SQL语句中的foreach的详细介绍

    foreach 也就是遍历迭代,在SQL中通常用在 in 这个关键词的后面foreach元素的属性主要有 item,index,collection,open,separator,close. 分别代 ...

  7. Spring之BeanPostProcessor(后置处理器)介绍

      为了弄清楚Spring框架,我们需要分别弄清楚相关核心接口的作用,本文来介绍下BeanPostProcessor接口 BeanPostProcessor   该接口我们也叫后置处理器,作用是在Be ...

  8. elasticsearch学习笔记--原理介绍

    前言:上一篇中我们对ES有了一个比较大概的概念,知道它是什么,干什么用的,今天给大家主要讲一下他的工作原理 介绍:ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户 ...

  9. Elasticsearch学习系列之介绍安装

    前言 关于ELK搭建的问题,或许你还有些模糊,其实你把我视频里讲的知识点串联起来就明白了.搭建ELK环境,看下面我说的: 首先,先把ES集群搭建起来,建议用CentOS6.5 64位的linux系统, ...

随机推荐

  1. APISpace 未来7天生活指数API接口 免费好用

    随着经济的发展,我们的生活水平在不断的提高,生活指数在我们的生活中也越来越受到关注,根据当天的生活指数,我们就可以知道在今天我们可以干什么比较好.   未来7天生活指数API,支持国内3400+个城市 ...

  2. 通过jmeter压测surging

    前言 surging是异构微服务引擎,提供了模块化RPC请求通道,引擎在RPC服务治理基础之上还提供了各种协议,并且还提供了stage组件,以便针对于网关的访问, 相对于功能,可能大家更想知道能承受多 ...

  3. 什么是FastAPI异步框架?(全面了解)

    一:FastAPI框架 1.FastAPI是应该用于构建API的现代,快速(高性能)的 web 框架,使用Python 3.6+ 并基于标准的 Python 类型提示. 关键性: 快速: 可与Node ...

  4. CVI中调用数据库的几点..

    1.各类开发工具开发的程序调用数据库,有两种方式:ADO和ODBC. 2.以ODBC方式访问SQL数据库,必须在电脑管理工具----ODBC管理器 中配置TCP/IP项(IP1.IP2.IP3.IPA ...

  5. GreatSQL FAQ

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 目录 0. GreatSQL简介 1. GreatSQL的特色有哪些 2. GreatSQL在哪里可以下载 二进制包.RP ...

  6. mysql-shell for GreatSQL 8.0.27编译安装及使用

    目录 0. 前言 1. 修改说明 2. 编译mysql-shell 2.1 环境准备 2.2 开始编译mysql & mysql-shell 2.3 利用patchelf修改mysqlsh二进 ...

  7. 只要9.9元!零基础学习MySQL

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 导语 经过一段时间的筹备和整理,万里数据库<零基础学习MySQL>课程正式在腾讯课堂上线了. 课程地址:htt ...

  8. SingleSphere类定义

    针对于单个球体的碰撞,其实和多个球体一样的,只是我修改了书上的代码,定义了这么多类,终于到头了.马上就要展示奇迹的时候了. 类定义: #pragma once #ifndef __SINGLESPHE ...

  9. 来看看这位年轻的 eBay 小伙是如何成为 Committer

    介绍一下我自己 目前就职于eBay中国,专注于微服务中间件,分布式架构等领域,同时也是狂热的开源爱好者. 如何成为一个commiter 过去几个月,我一直持续在为 Apache DolphinSche ...

  10. mybatis 13: 一对多关联查询

    业务背景 根据客户id查询客户基本信息,以及客户存在的订单信息 两张数据表 客户表 订单表 实体类 客户实体类:Customer private Integer id; private String ...