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系统, ...
随机推荐
- 记一次实战 Shiro反序列化内网上线
Shiro反序列化内网上线 说明:此贴仅分享用于各安全人员进行安全学习提供思路,或有合法授权的安全测试,请勿参考用于其他用途,如有,后果自负.感谢各位大佬的关注 目标:152.xxx.xxx.xxx目 ...
- super详解(继承)
//在Java中,所有的类,都默认直接或者间接继承objec类// Person 人 :父类public class Person /*extends object*/ { public Person ...
- HTML及HTTP协议
web服务的过程: 浏览器发请求 --> HTTP协议 --> 服务端接收请求 --> 服务端返回响应 --> 服务端把HTML文件内容发给浏览器 --> 浏览器渲染页面 ...
- MATLAB复习资料——浙商大管工学院适用
包含12套复习卷,课堂PPT 下载链接:MATLAB练习模拟题库(12套).pdf - 蓝奏云 (lanzoub.com)
- 可控线性序列机(查看除了inout端口外的其他变量的波形的方法)
可控线性序列机: 可控:有个控制端控制何时输出线性序列. 线性序列机:输出一个线性序列. 知识点: 1.包含多个判定条件时用英文()括起来,用&&连接. 2.使能端EN的设置(类似于D ...
- 平衡树——splay 二
上文传送门:平衡树--splay 一 - yi_fan0305 - 博客园 (cnblogs.com) OK,我们继续上文,来讲一些其他操作. 七.找排名为k的数 和treap的操作很像,都是通过比较 ...
- Linux上安装java
1,输入命令,查看是否已经安装了Openjdk:rpm -qa | grep java 如果有已经安装的java版本或者版本低于1.7,卸载该jdk:rpm -e 软件包名字 如果不能卸载,可以加上 ...
- linux常见命令(七)
df/du/ln/lsblk/mount磁盘和目录的容量df 列出文件系统整体的磁盘使用量查看磁盘占用量并用易读的格式显示出来df -hdu 列出目录的磁盘占用量查看当前目录下每个目录/文件的占用量, ...
- Taurus.MVC 微服务框架 入门开发教程:项目部署:3、微服务应用程序版本升级:全站升级和局部模块升级。
系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 本系列第一篇:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单 ...
- Python逆向爬虫之scrapy框架,非常详细
爬虫系列目录 目录 Python逆向爬虫之scrapy框架,非常详细 一.爬虫入门 1.1 定义需求 1.2 需求分析 1.2.1 下载某个页面上所有的图片 1.2.2 分页 1.2.3 进行下载图片 ...