转载自: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 中:

PUT my_index/_doc/1
{
"tags": "Movies,Beauty,Music,food"
} PUT my_index/_doc/2
{
"tags": ""
}

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

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

PUT _ingest/pipeline/my_pipeline
{
"processors": [
{
"set": {
"if": "ctx['tags'].empty",
"field": "tags",
"value": "Music"
}
}
]
}

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

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

POST _ingest/pipeline/my_pipeline/_simulate
{
"docs": [
{
"_source": {
"tags": "Movies,Beauty,Music,Food"
}
},
{
"_source":{
"tags": ""
}
}
]
}

运行上面的测试文档:

{
"docs" : [
{
"doc" : {
"_index" : "_index",
"_type" : "_doc",
"_id" : "_id",
"_source" : {
"tags" : "Movies,Beauty,Music,Food"
},
"_ingest" : {
"timestamp" : "2020-09-16T06:55:36.657202Z"
}
}
},
{
"doc" : {
"_index" : "_index",
"_type" : "_doc",
"_id" : "_id",
"_source" : {
"tags" : "Music"
},
"_ingest" : {
"timestamp" : "2020-09-16T06:55:36.657205Z"
}
}
}
]
}

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

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

PUT _ingest/pipeline/my_pipeline
{
"processors": [
{
"set": {
"if": "ctx['tags'].empty",
"field": "tags",
"value": "Music"
}
},
{
"split": {
"if": "!(ctx['tags'].empty)",
"field": "tags",
"separator": ","
}
}
]
}

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

{
"docs" : [
{
"doc" : {
"_index" : "_index",
"_type" : "_doc",
"_id" : "_id",
"_source" : {
"tags" : [
"Movies",
"Beauty",
"Music",
"Food"
]
},
"_ingest" : {
"timestamp" : "2020-09-16T06:58:51.956573Z"
}
}
},
{
"doc" : {
"_index" : "_index",
"_type" : "_doc",
"_id" : "_id",
"_source" : {
"tags" : [
"Music"
]
},
"_ingest" : {
"timestamp" : "2020-09-16T06:58:51.956577Z"
}
}
}
]
}

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

PUT _ingest/pipeline/my_pipeline
{
"processors": [
{
"set": {
"if": "ctx['tags'].empty",
"field": "tags",
"value": "Music"
}
},
{
"split": {
"if": "!(ctx['tags'].empty)",
"field": "tags",
"separator": ","
}
},
{
"foreach": {
"if": "!ctx['tags'].empty",
"field": "tags",
"processor": {
"lowercase": {
"field": "_ingest._value"
}
}
}
}
]
}

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

{
"docs" : [
{
"doc" : {
"_index" : "_index",
"_type" : "_doc",
"_id" : "_id",
"_source" : {
"tags" : [
"movies",
"beauty",
"music",
"food"
]
},
"_ingest" : {
"_value" : null,
"timestamp" : "2020-09-16T07:02:32.963724Z"
}
}
},
{
"doc" : {
"_index" : "_index",
"_type" : "_doc",
"_id" : "_id",
"_source" : {
"tags" : [
"music"
]
},
"_ingest" : {
"_value" : null,
"timestamp" : "2020-09-16T07:02:32.963728Z"
}
}
}
]
}

这一次,我们看到了所有的在 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. ooday08 Java_多态_向下强制转型

    笔记: 多态: 表现: 同一个对象被造型为不同的类型时,有不同的功能 --对象的多态:我.你.水......------所有对象都是多态的(明天体会) 同一类型的引用指向不同的对象时,有不同的实现 - ...

  2. Solution -「树上杂题?」专练

    主要是记录思路,不要被刚开始错误方向带偏了 www 「CF1110F」Nearest Leaf 特殊性质:先序遍历即为 \(1 \to n\),可得出:叶子节点编号递增或可在不改变树形态的基础上调整为 ...

  3. ROS机械臂 Movelt 学习笔记1 | 基础准备

    环境:Ubuntu18.04 + ROS Melodic 1. 安装ROS 官网下载安装步骤:http://wiki.ros.org/melodic/Installation/Ubuntu 一键安装的 ...

  4. angular 变化检测和ngZone

  5. 【MySQL 8】Generated Invisible Primary Keys(GIPK)

    从MySQL 8.0.30开始,MySQL支持在GIPK模式下运行时生成不可见的主键.在这种模式下运行时,对于任何在没有显式主键的情况下创建的InnoDB表,MySQL服务器会自动将生成的不可见主键 ...

  6. Java学习第五周

    这周学习了异常与多线程,线程使用 Exception异常的分类: 1.编译时异常:继承自Exception的异常或者其子类,编译阶段就会报错 2.运行时异常:继承自RuntimeException的异 ...

  7. 「APIO2010」巡逻 题解

    来源 LCA 个人评价:lca求路径,让我发现了自己不会算树的直径(但是本人似乎没有用lca求) 1 题面 「APIO2010」巡逻 大意:有一个有n个节点的树,每条边权为1,一每天要从1号点开始,遍 ...

  8. Linux Shell 自动交互功能

    需求背景:   近日,在安装某软件过程,发现在安装过程需要输入一些信息才能继续下一步操作,在机器数量较少情况下,我们可以单台登录上去完成安装操作,但当机器数量超过一定时,如果再手动登录操作,就会产生大 ...

  9. 你有对象类,我有结构体,Go lang1.18入门精炼教程,由白丁入鸿儒,go lang结构体(struct)的使用EP06

    再续前文,在面向对象层面,Python做到了超神:万物皆为对象,而Ruby,则干脆就是神:飞花摘叶皆可对象.二者都提供对象类操作以及继承的方式为面向对象张目,但Go lang显然有一些特立独行,因为它 ...

  10. php YII2空数组插入报错问题处理 Array to string conversion

    问题描述 前端传空数组 [],php接收后处理不当插入数据库时报错Array to string conversion 参数示例 { "id": 0, //ID整型 "t ...