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下IPC之共享内存的使用方法
基本参考 <Unix环境高级编程>第14.9节共享内存来学习. 参考blog:https://blog.csdn.net/weixin_45794138/article/details/1 ...
- Sharding-jdbc 5.1.2案例
简介 sharding-jdbc案例,版本5.1.2 springboot + mybatis-plus + sharding-jdbc 项目地址:sharding-jdbc-example 模块说明 ...
- odoo 14 一些常见问题集
1 # 当你往tree或者form视图中增加action的时候 2 # 记住!千万别重名 3 # 一旦重名,Export.Delete.Archive.Unarchive都会消失不见 4 # tree ...
- React报错之Functions are not valid as a React child
正文从这开始~ 总览 产生"Functions are not valid as a React child. This may happen if you return a Compone ...
- Luogu5019 铺设道路 (贪心)
水题,水得好无语 #include <iostream> #include <cstdio> #include <cstring> #include <alg ...
- Luogu3402【模板】可持久化并查集 (主席树)
用\(depth\)按秩合并,不能直接启发,数组开40倍左右 #include <iostream> #include <cstdio> #include <cstrin ...
- 前端React项目遇到【Uncaught SyntaxError: Unexpected token '<'】错误的解决方式
问题描述 前端部署好项目后,打开相应的页面显示一片空白,打开console显示 问题排查思路 理解问题的本质 出现这个错误的原因是浏览器期望得到js文件,但页面却返回了html文件,如图中的js文件点 ...
- 通过route , tracert , traceroute 查看本地路由配置及访问ip或域名时经过的路由信息
转载请注明出处: 1.路由器和交换机的区别和过程 在windows 系统或linux 系统访问 外网ip 或域名时,都会通过层层的路由器,然后将请求转发到最终的目标服务器:因为互联网通过路由器实现公网 ...
- 【ARK UI】HarmonyOS ETS 资源管理基本使用
代码实现 api讲解 getStringArray getStringArray(resId: number, callback: AsyncCallback<Array>): void ...
- 小技巧---eclipse 全选lib jar包
按住shift键,点击第一个jar包,然后点击最后一个jar包,就全选了所有jar包,然后添加build path 添加到类路径