ElasticSearch之Ingest Pipeline和Painless Script

写在前面

如果是我们需要在写入文档或者是返回文档时,进行修改字段值,或者增加字段等操作时,就可以考虑使用ingest pipeline和painless script。如下的需求:
在这里插入图片描述

1:ingest pipeline

在es 5中引入了一种新的节点类型ingest node,ingest node具备对数据预处理的能力,使用的就是ingest pipeline。ingest pipeline可以拦截index或者时bulk的请求,对数据处理后重新返回回去,最终保存通过ingest pipeline处理后的数据,如下图:
在这里插入图片描述
通过一组processor来处理数据,可以使用内置的processor,也可以使用插件的方式来自定义processor,其中内置的processor列表如下:
在这里插入图片描述
在这里插入图片描述

另外es提供了simulate的API来模拟ingest pipeline的执行效果:
在这里插入图片描述
在这里插入图片描述
接下来我们看实际的例子。

1.1:实例

  • 定义一个pipeline,方便使用

当然也可以直接写pipeline来用。

# 为ES添加一个 Pipeline
PUT _ingest/pipeline/blog_pipeline
{
  "description": "a blog pipeline",
  "processors": [
    {
      "split": {
        "field": "tags",
        "separator": ","
      }
    },
    {
      "set": {
        "field": "views",
        "value": 0
      }
    }
  ]
}

通过slit分割tags,通过set给文档增加一个字段views,值为0。

  • 查看定义的pipeline
    在这里插入图片描述
  • 测试pipeline
    正式使用之前先来测试一下:
    在这里插入图片描述
  • 不使用pipeline新增数据
PUT tech_blogs/_doc/1
{
  "title": "Introducing big data......",
  "tags": "hadoop,elasticsearch,spark",
  "content": "You konw, for big data"
}
  • 使用pipeline新增数据
PUT tech_blogs/_doc/2?pipeline=blog_pipeline
{
  "title": "Introducing cloud computering",
  "tags": "openstack,k8s",
  "content": "You konw, for cloud"
}

看下新增的数据:
在这里插入图片描述

  • update_by_query使用pipeline重建本索引
    在这里插入图片描述
    因为pipeline处理后插入的数据底层是ArrayList类型,无法再执行split操作,想要重建索引的话,只需要将已经被pipeline处理过数据过滤掉即可,如果是包含views就是处理过的,如下:
POST tech_blogs/_update_by_query?pipeline=blog_pipeline
{
  "query": {
    "bool": {
      "must_not": {
        "exists": {
          "field": "views"
        }
      }
    }
  }
}

在这里插入图片描述

1.2:和logstash的比较

在这里插入图片描述

2:painless script

palinless script载es5引入,支持Java,其可实现功能如下:

1:对写入的文档增加,删除,修改字段,可配合ingest pipeline使用
2:对返回的文档增加,删除,修改字段(此时不会影响数据库中的文档)
3:function score,基于相关度评分,按照新规则生成新评分,从而影响最终文档的排序结果:https://dongyunqi.blog.csdn.net/article/details/136341656

2.1:painless 上下文

需要需要在painless脚本中访问文档数据,执行具体的操作,所以就需要对文档的访问,而对文档的访问在不同的上下文中是不一样的,主要有如下三种:

1:在pipeline中,通过ctx.fieldname的方式来访问
2:在update中通过ctx_source.fieldname的方式来访问
3:在search和aggregation中通过dock[fieldname]的方式来访问

2.2:实例

2.2.1:pipeline

使用splitprocesscor将字符串分割为字符串,使用painless scrit增加属性content_length,使用setprocessor增加属性views并设置值为0。

POST _ingest/pipeline/_simulate
{
  "pipeline": {
    "description": "to split blog tags",
    "processors": [
      {
        "split": {
          "field": "tags",
          "separator": ","
        }
      },
      {
        "script": {
          "source": """
          if(ctx.containsKey("content")){
            ctx.content_length = ctx.content.length();
          }else{
            ctx.content_length=0;
          }


          """
        }
      },

      {
        "set":{
          "field": "views",
          "value": 0
        }
      }
    ]
  },

  "docs": [
    {
      "_index":"index",
      "_id":"id",
      "_source":{
        "title":"Introducing big data......",
  "tags":"hadoop,elasticsearch,spark",
  "content":"You konw, for big data"
      }
    },


    {
      "_index":"index",
      "_id":"idxx",
      "_source":{
        "title":"Introducing cloud computering",
  "tags":"openstack,k8s",
  "content":"You konw, for cloud"
      }
    }

    ]
}

在这里插入图片描述

2.2.2:update

  • 准备测试数据
DELETE tech_blogs
PUT tech_blogs/_doc/1
{
  "title":"Introducing big data......",
  "tags":"hadoop,elasticsearch,spark",
  "content":"You konw, for big data",
  "views":0
}
  • 将views增加100
POST tech_blogs/_update/1
{
  "script": {
    "source": "ctx._source.views += params.new_views",
    "params": {
      "new_views": 100
    }
  }
}

GET tech_blogs/_search

在这里插入图片描述

  • 使用预定义painless脚本的方式更新
    预定义painless脚本,并通过入参的方式,给views+1000。
#保存脚本在 Cluster State
POST _scripts/update_views
{
  "script": {
    "lang": "painless",
    "source": "ctx._source.views += params.new_views"
  }
}

POST tech_blogs/_update/1
{
  "script": {
    "id": "update_views",
    "params": {
      "new_views": 1000
    }
  }
}

GET tech_blogs/_search

在这里插入图片描述

2.2.3:search

返回结果中增加rnd_views字段,其中以views字段并给其加上1000以内的随机数获取作为值:

GET tech_blogs/_search
{
  "script_fields": {
    "rnd_views": {
      "script": {
        "lang": "painless",
        "source": """
          java.util.Random rnd = new Random();
          doc['views'].value+rnd.nextInt(1000);
"""
      }
    }
  },
  "query": {
    "match_all": {}
  }
}

在这里插入图片描述

写在后面

参考文章列表

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/474842.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

安科瑞智能断路器产品介绍【可监可控 远程操控 短路保护】

开发背景 过去几年智慧用电的产品应用中,大多数只安装于进线测。主要存在以下几个问题:难定位,不知道具体哪个回路出线问题,排查困难;出线过载或线缆温度过高无法知晓;即使是出线回路安装了的场景&#xf…

个人开发App成功上架手机应用市场的关键步骤

目录 1. 苹果审核和APP备案 2. APP上架操作步骤 3. 审核和发布 4. 上线工作 总结 参考资料 在当前移动应用市场竞争激烈的背景下,个人开发App如何成功上架成为开发者们必须面对的重要任务。本文将重点介绍自建App上架至手机应用市场的流程,包括苹果…

2024你必须知道的外贸形势!

2024年外贸形势下的新机会在哪里?今天Erica给大家总结了几个主要市场的形式。 喜欢的话点点关注吧~ 欧美市场2024年应谨慎开发 海关总署11月7日发布的数据显示,前10个月,今年中国对欧洲出口呈下降趋势,中国与欧盟贸易总值为4.5…

前端项目,个人笔记(六)【无限滚动 + 拦截器】

目录 1、无限滚动 2、使用pinia进行用户数据持久化 3、完善个人笔记三中的拦截器 请求拦截器&#xff1a; 响应拦截器&#xff1a; 1、无限滚动 使用elementplus中提供的&#xff1a; 代码&#xff1a; <div class"body" v-infinite-scroll"load"…

【复现】某指挥调度管理平台 SQL注入漏洞_66

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一&#xff1a; 四.修复建议&#xff1a; 五. 搜索语法&#xff1a; 六.免责声明 一.概述 该平台提供强大的指挥调度功能&#xff0c;可以实时监控和管理通信网络设备、维护人员和工作任务等。用户可以通过该平台发送指令…

积鼎CFD发动机燃烧仿真,实现航空航天发动机内部燃烧过程的流体仿真

航空航天发动机中的燃烧现象是一种复杂的物理化学过程&#xff0c;包括流动、雾化、相变、传热传质、点火熄火、化学反应、污染物排放、热声振荡和冷却等多个过程&#xff0c;加上燃烧的非定常性和高湍流度&#xff0c;使得准确模拟燃烧过程变得异常困难。在传统CFD模拟需要考虑…

Docker在Mac上轻松部署RabbitMQ:从拉取镜像到创建运行带管理界面的容器全攻略

1、去官网下载docker 安装&#xff1a;把图标拉到应用程序即可 https://docs.docker.com/desktop/install/mac-install/ 2、拉取rabbitmq镜像 docker pull rabbitmq:3.8-management 3、创建并启动容器&#xff0c;同时设置环境变量以创建用户和密码 docker run -d --name m…

python中医学习服务管理系统flask-django-php-nodejs

随着世界经济信息化、全球化的到来和互联网的飞速发展&#xff0c;推动了各行业的改革。若想达到安全&#xff0c;快捷的目的&#xff0c;就需要拥有信息化的组织和管理模式&#xff0c;建立一套合理、动态的、交互友好的、高效的中医学习服务管理系统。当前的信息管理存在工作…

YOLOV5 部署:cuda和cuDNN安装

1、前言 TensorRT 的安装需要配合cuda的使用,所以这里需要安装cuda和cudnn用于加速推理 TensorRT 就是神经网络专门用来加速的框架 之前训练yolov5项目的时候,我们只是配置了torch的GPU环境,没有专门安装cuda和cudnn,因为简单的训练、推理没必要cuda加速。 torch的GPU配置…

MINT: Detecting Fraudulent Behaviors from Time-series Relational Data论文阅读笔记

2. 问题定义 时间序列关系数据&#xff08;Time Series Relation Data&#xff09; 这个数据是存放在关系型数据库中&#xff0c;每一条记录都是泰永时间搓的行为。 更具体地&#xff0c;每条记录表示为 x ( v , t , x 1 , x 2 , … , x m − 2 ) x (v,t,x_1,x_2,\dots,x…

【JS】浅谈Promise

Promise 前言一、Promise是什么&#xff1f;二、为什么用Promise&#xff1f;2.1解决回调地狱2.2 集中错误处理2.3代码解耦和复用 三、做什么&#xff1f;四、原型方法和实例方法&#xff1f;五、应用场景&#xff1f; 前言 promise是es6的新规范&#xff0c;它是一种异步解决…

粗糙度对应表,觉得挺实用

粗糙度新老标准经常会遇到&#xff0c;分享给大家

大数据分析师特训营介绍

大数据分析师是做什么的&#xff1f; 数据分析师是在不同行业中&#xff0c;专门从事行业数据搜集、整理、分析&#xff0c;并依据数据做出行业研究、评估和预测等工作的。与传统的数据分析师相比&#xff0c;大数据分析师要学会打破信息孤岛利用各种数据源&#xff0c;在海量…

ByteTrack多目标跟踪——YOLOX详解

文章目录 1 before train1.1 dataset1.2 model 2 train2.1 Backbone2.2 PAFPN2.3 Head2.3.1 Decoupled Head2.3.2 anchor-free2.3.3 标签分配① 初步筛选② simOTA 2.3.4 Loss计算 项目地址&#xff1a; ByteTrack ByteTrack使用的检测器是YOLOX&#xff0c;是一个目前非常流行…

Ceres求解非线性优化问题步骤与示例

【版权声明】 本文为博主原创文章&#xff0c;未经博主允许严禁转载&#xff0c;我们会定期进行侵权检索。 在计算机视觉和机器人领域&#xff0c;经常需要解决非线性优化问题来估计相机姿态或运动模型。Ceres Solver是一个开源的C库&#xff0c;专门用于解决最小二乘问题&am…

Linux系统如何使用tcpdump实时监控网络速度:方法与技巧解析

在网络管理和故障排查中&#xff0c;了解网络速度是一个重要的环节。而tcpdump&#xff0c;作为一个强大的网络数据包分析工具&#xff0c;不仅可以用于分析数据包的内容&#xff0c;还能用于实时监控网络速度。本文将介绍Linux系统如何使用tcpdump来实时监控网络速度。 首先&…

智能型程控直流电子负载特点和特性

智能型程控直流电子负载是高精度、高稳定性的电源测试设备&#xff0c;主要用于对电源、电池、充电器等直流电源设备的输出性能进行测试。它具有以下特点和特性&#xff1a; 智能型程控直流电子负载采用先进的控制算法和高精度的ADC&#xff0c;能够实现对电流、电压、功率等参…

【EOJ】2985.圆和正方形

单点时限: 2.0 sec 内存限制: 256 MB 小王首先在平面上画一个边长为 K 的正方形 S1&#xff0c;然后又画一个 S1 的内切圆 C1&#xff0c;这算做一次操作。然后接着画 C1 的一个内切正方形 S2&#xff0c;和 S2 的一个内切圆 C2&#xff0c;这算第二次操作。他一直进行了 K 次…

前端学习笔记 | JS进阶

一、作用域 1、局部作用域 &#xff08;1&#xff09;函数作用域 &#xff08;2&#xff09;块作用域 let和const会产生块作用域 &#xff0c;而var不会产生块作用域 2、全局作用域 script标签和js文件的【最外层】变量 3、作用域链 本质&#xff1a;底层的变量查找机制 4、JS…

AI时代,我靠2个页面,一个AI产品开始变现

大家好&#xff0c;我是AI时间线的作者&#xff0c;AI时间线这个产品是我利用过年期间半天时间开发出来的一个产品。 产品地址:http://www.ai-timeline.top/ 核心功能主要是根据关键词生成时间线&#xff0c;大家可以看看产品上使用教程&#xff0c;非常简单 当然幸运的是目前产…