Elasticsearch:foreach 摄入处理器介绍---处理未知长度数组中的元素
转载自: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 摄入处理器介绍---处理未知长度数组中的元素的更多相关文章
- java中的foreach输出数组中的元素
public class forEach { public static void main(String[]args){ String [] hobby = {"imooc",& ...
- PHP删除数组中空值的方法介绍
这篇文章主要介绍了PHP删除数组中空值的方法介绍,需要的朋友可以参考下 说来惭愧,以前在去掉数组的空值是都是强写foreach或者while的,利用这两个语法结构来删除数组中的空元素,简单代码如下: ...
- js数组中的find(), findIndex(), filter(), forEach(), some(), every(), map(), reduce()方法的详解和应用实例
1. find()与findIndex() find()方法,用于找出第一个符合条件的数组成员.它的参数是一个回调函数,所有数组成员依次执行该回调函数,直到找出第一个返回值为true的成员,然后返回该 ...
- 数组中的forEach和map的区别
大多数情况下,我们都要对数组进行遍历,然后经常用到的两个方法就是forEach和map方法. 先来说说它们的共同点 相同点 都是循环遍历数组中的每一项 forEach和map方法里每次执行匿名函数都支 ...
- (转载)js数组中的find、filter、forEach、map四个方法的详解和应用实例
数组中的find.filter.forEach.map四个语法很相近,为了方便记忆,真正的掌握它们的用法,所以就把它们总结在一起喽. find():返回通过测试的数组的第一个元素的值 在第一次调用 c ...
- MyBatis:SQL语句中的foreach的详细介绍
foreach 也就是遍历迭代,在SQL中通常用在 in 这个关键词的后面foreach元素的属性主要有 item,index,collection,open,separator,close. 分别代 ...
- Spring之BeanPostProcessor(后置处理器)介绍
为了弄清楚Spring框架,我们需要分别弄清楚相关核心接口的作用,本文来介绍下BeanPostProcessor接口 BeanPostProcessor 该接口我们也叫后置处理器,作用是在Be ...
- elasticsearch学习笔记--原理介绍
前言:上一篇中我们对ES有了一个比较大概的概念,知道它是什么,干什么用的,今天给大家主要讲一下他的工作原理 介绍:ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户 ...
- Elasticsearch学习系列之介绍安装
前言 关于ELK搭建的问题,或许你还有些模糊,其实你把我视频里讲的知识点串联起来就明白了.搭建ELK环境,看下面我说的: 首先,先把ES集群搭建起来,建议用CentOS6.5 64位的linux系统, ...
随机推荐
- Linux 任务计划管理
在某个时间点执行一次任务 at工具 作用:用于执行一次性任务,需要指定执行的时间. at工具来源于at软件包. 依赖与atd服务,需要启动才能实现at任务.#通过这个守护进程见监控at的相关内容 #选 ...
- Linux系统安全与应用
补充:重定向 类型 操作符 ...
- Office共享协作方法——Office共享的正确打开方式、office365白嫖
OFFICE共享协作方法: 1.OFFICE365激活<推荐.一劳永逸.体验最新版office,协作体验更佳> 一部分用户自带的Office可以用KMS直接激活,那就ok了,注意激活前关闭 ...
- ETL工具 Flume (一)
分布式日志采集系统Flume学习 一.Flume架构 1.1 Hadoop业务开发流程 1.2 Flume概述 flume是一个分布式.可靠.和高可用的海量日志采集.聚合和传输的系统. 支持在日志系统 ...
- JavaScript进阶内容——DOM详解
JavaScript进阶内容--DOM详解 当我们已经熟练掌握JavaScript的语法之后,我们就该进入更深层次的学习了 首先我们思考一下:JavaScript是用来做什么的? JavaScript ...
- Centos7借助docker部署mysql,提供远程链接服务
Centos7 借助docker部署mysql,并提供远程连接服务 安装docker 运行docker 注意安装docker和运行docker的步骤很简单,可以参考我学习docker的笔记 docke ...
- NOI / 1.2编程基础之变量定义、赋值及转换全题详解(5063字)
目录 01:整型数据类型存储空间大小 02:浮点型数据类型存储空间大小
- 思维导图学《On Java》基础卷
说明 原来读过 <Java 编程思想(第 4 版)>,但是这个版本还是基于 Java 5 讲解.由于 Java 8 做出了非常大的改进(是 Java 变化最大的版本),且截止到 2022- ...
- Collection集合和Collection的常用功能
boolean add(E e); 向集合里添加元素 boolean remove(E e); 删除集合中的某个元素 void clear(); 清空集合的所有元素 boolean contains( ...
- 获取字典中values值中最大的数,返回对应的keys
1.字典中键值对的获取 print(data.values()) # 查看字典的值 print(data.keys()) # 查看字典的key 2.对字典中的值进行排序 sorted(data.val ...