elasticsearch使用painless的一些简单例子

news2024/12/29 13:44:45

文章目录

  • 1、背景
  • 2、准备数据
    • 2.1 mapping
    • 2.2 插入数据
  • 3、例子
    • 3.1 (update)更新文档 id=1 的文档,将 age 加 2岁
    • 3.2 (update_by_query)如果 province 是北京的话,就将 age 减少1岁
    • 3.3 (ctx.op)如果张三的年龄小于20岁就不处理,否则就删除这个文档
    • 3.4 (stored script)如果是湖南省则增加地市字段,值为长沙
        • 3.4.1 创建存储脚本
        • 3.4.2 使用存储脚本
    • 3.5 (pipeline)通过pipeline如果插入的文档的age<10则放入到index_person_small索引中
        • 3.5.1 创建pipeline
        • 3.5.2 使用pipeline
        • 3.5.3 运行结果
    • 3.6 function_score中使用script_score算分
      • 3.6.1 需求
      • 3.6.2 dsl
      • 3.6.3 运行结果
    • 3.7 script_fields 增加字段
    • 3.8 runtime field 增加字段
      • 3.8.1 需求
      • 3.8.2 dsl
    • 3.9 _reindex 中使用
      • 3.9.1 dsl
      • 3.9.2 运行结果
    • 3.10 script query 查询age<25
    • 3.11 script 聚合
  • 4、painless脚本调试
  • 5、脚本中的doc[..]和params._source[..]
  • 6、painless脚本中的上下文

1、背景

此篇文档仅仅是简单的记录一下painless的一些简单的例子,防止以后忘记,不过多涉及painless的语法。

2、准备数据

2.1 mapping

PUT /index_person
{
  "mappings": {
    "properties": {
      "name": {
        "type": "keyword"
      },
      "age": {
        "type": "integer"
      },
      "province": {
        "type": "keyword"
      }
    }
  }
}

2.2 插入数据

PUT /index_person/_bulk
{"index":{"_id":1}}
{"name":"张三","age":20,"province":"湖北"}
{"index":{"_id":2}}
{"name":"李四","age":25,"province":"北京"}
{"index":{"_id":3}}
{"name":"王五","age":30,"province":"湖南"}

3、例子

3.1 (update)更新文档 id=1 的文档,将 age 加 2岁

POST index_person/_update/1
{
  "script": {
    "lang": "painless",
    "source": """
      ctx['_source']['age'] += params['incrAge']
    """,
    "params": {
      "incrAge": 2
    }
  }
}

3.2 (update_by_query)如果 province 是北京的话,就将 age 减少1岁

POST index_person/_update_by_query
{
  "query": {
    "term": {
      "province": {
        "value": "北京"
      }
    }
  },
  "script": {
    "lang": "painless",
    "source": """
      ctx['_source']['age'] -= params['decrAge']
    """,
    "params": {
      "decrAge": 1
    }
  }
}

3.3 (ctx.op)如果张三的年龄小于20岁就不处理,否则就删除这个文档

POST index_person/_update/1
{
  "script": {
    "lang": "painless",
    "source": """
      // 这是默认值,表示的是更新值,重新索引记录
      ctx.op = 'index';
      if(ctx._source.age < 20){
        // 表示不处理
        ctx.op = 'none';
      }else{
        // 表示删除这个文档
       ctx.op = 'delete'; 
      }
    """
  }
}

3.4 (stored script)如果是湖南省则增加地市字段,值为长沙

3.4.1 创建存储脚本

PUT _scripts/add_city
{
  "script":{
    "lang": "painless",
    "source": "ctx._source.city = params.city"
  }
}

add_city为脚本的id

3.4.2 使用存储脚本

POST index_person/_update_by_query
{
  "query": {
    "term": {
      "province": {
        "value": "湖南"
      }
    }
  },
  "script": {
    "id": "add_city",
    "params": {
      "city": "长沙"
    }
  }
}

3.5 (pipeline)通过pipeline如果插入的文档的age<10则放入到index_person_small索引中

3.5.1 创建pipeline

PUT _ingest/pipeline/pipeline_index_person_small
{
  "description": "如果插入的文档的age<10则放入到index_person_small索引中",
  "processors": [
    {
      "script": {
        "source": """
            if(ctx.age < 10){
              ctx._index = 'index_person_small';
            }
          """
      }
    }
  ]
}

3.5.2 使用pipeline

PUT index_person/_doc/4?pipeline=pipeline_index_person_small
{
  "name":"赵六",
  "age": 8,
  "province":"四川"
}

3.5.3 运行结果

运行结果

3.6 function_score中使用script_score算分

3.6.1 需求

如果这个用户是湖南的,则使用 age作为分数

3.6.2 dsl

GET index_person/_search
{
  "query": {
    "function_score": {
      "query": {
        "match_all": {}
      },
      "functions": [
        {
          "script_score": {
            
            "script": """
              if(doc.province.value == 0){
                return 0;
              }
            
              if(doc.province.value == '湖南'){
                return doc.age.value;
              }
              return 0;
            """
          }
        }
      ],
      "boost_mode": "sum",
      "score_mode": "sum"
    }
  }
}

3.6.3 运行结果

运行结果

3.7 script_fields 增加字段

GET index_person/_search
{
  "query": {"match_all": {}},
  "fields": [
    "double_age"
  ], 
  "script_fields": {
    "double_age": {
      "script": {
        "lang": "painless",
        "source": "doc.age.value * 2"
      }
    }
  }
}

3.8 runtime field 增加字段

3.8.1 需求

针对age<25的文档,返回double_age字段,否则不处理。

3.8.2 dsl

GET index_person/_search
{
  "query": {
    "match_all": {}
  },
  "fields": [
    "double_age"
  ],
  "runtime_mappings": {
    "double_age":{ 
      "type": "keyword",
      "script": """
        if(doc.age.size() == 0){
          return;
        }
        if(doc.age.value < 25){
          emit(doc.age.value * 2 + '');
        }
      """
    }
  }
}

在runtime field 中,需要使用emit来返回数据,但是不是emit(null)

3.9 _reindex 中使用

3.9.1 dsl

POST _reindex
{
  "source": {
    "index": "index_person"
  },
  "dest": {
    "index": "index_person_new"
  },
  "script": {
    "lang": "painless",
    "source": """
      if(ctx._source.age < 25){
        ctx._source.tag = '年轻人';
      }else{
        ctx._source.tag = '中年人';
      }
    """
  }
}

3.9.2 运行结果

运行结果

3.10 script query 查询age<25

GET index_person/_search
{
  "query": {
    "script": {
      "script": {
        "lang": "painless",
        "source": """
          if(doc.age.size() == 0){
            return false;
          }
          return doc.age.value < 25;
        """
      }
    }
  }
}

3.11 script 聚合

GET index_person/_search
{
  "size": 0, 
  "aggs": {
    "agg_province": {
      "terms": {
        "script": {
          "lang": "painless",
          "source": """
            return doc.province
          """
        }, 
        "size": 10
      }
    },
    "agg_age":{
      "avg": {
        "script": "params._source.age"
      }
    }
  }
}

4、painless脚本调试

painless脚本调试
可以通过Debug.explain来进行一些简单的调试。

5、脚本中的doc[…]和params._source[…]

doc[…]:使用doc关键字,将导致该字段的术语被加载到内存(缓存),这将导致更快的执行,但更多的内存消耗。此外,doc[…]表示法只允许简单的值字段(您不能从中返回json对象),并且仅对非分析或基于单个术语的字段有意义。然而,如果可能的话,使用doc仍然是访问文档值的推荐方法。
params[_source][…]: 每次使用_source都必须加载和解析, 因此使用_source会相对而言要慢点。

脚本中的doc[..]和params._source[..]

6、painless脚本中的上下文

painless脚本中的上下文
详细了解,请参考这个文档https://www.elastic.co/guide/en/elasticsearch/painless/current/painless-contexts.html

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MLX90316KGO-BDG-100-RE传感器 旋转位置 角度测量

介绍MLX90316是Tria⊗is旋转位置传感器&#xff0c;提供在设备表面旋转的小偶极磁铁(轴端磁铁)的绝对角位置。得益于其表面的集成磁集中器(IMC)&#xff0c;单片设备以非接触式方式感知应用磁通量密度的水平分量。这种独特的传感原理应用于旋转位置传感器&#xff0c;可在机械(…

(1分钟速通面试) 矩阵分解相关内容

矩阵分解算法--总结QR分解 LU分解本篇博客总结一下QR分解和LU分解&#xff0c;这些都是矩阵加速的操作&#xff0c;在slam里面还算是比较常用的内容&#xff0c;这个地方在isam的部分出现过。(当然isam也是一个坑&#xff0c;想要出点创新成果的话 可能是不太现实的 短期来讲 哈…

【电商】订单系统--售后的简易流程与系统关系

用户进行了订单签收并不意味着终结&#xff0c;这只是一个新的开始&#xff0c;因为商品送达后可能会由于运输过程包装或商品有破损&#xff0c;商品本质量并非商品详情中所描述的那样等各种原因使用户进行退货或换货&#xff1b;还有一种场景是用户签收后发现有的商品漏发、少…

线性卡尔曼滤波详解

自动驾驶面临的第一个问题&#xff1a;从哪里来&#xff0c;到哪里去&#xff1f;要解决这个问题&#xff0c;自动驾驶汽车首先需要准确的知道自己在地图上的位置。理所当然的我们可以想到通过GPS来进行定位&#xff0c;但获取GPS信号需要跟卫星进行通信&#xff0c;这就导致它…

简单的洗牌(数据结构系列4)

目录 前言&#xff1a; 1.思想 1.1基本框架的搭建 1.2洗牌操作 1.3揭牌 2.代码运行结果截图 结束语&#xff1a; 前言&#xff1a; 在上一次的博客中小编与大家分享了ArrayList的模拟实现和一些具体的使用方法&#xff0c;那么接下来我们通过一个简单的洗牌练习来巩固一…

Java创建枚举类并定义使用枚举项

前言 在项目开发中&#xff0c;常量和枚举都是我们经常使用的技巧。都是为了提高开发效率。常量我们一般都会创建一个常量类&#xff0c;里面放一些经常使用的变量&#xff0c;例如&#xff1a; 枚举的定义和使用相比于常量&#xff0c;也是有异曲同工之巧的&#xff0c;下面就…

梅开二度的 axios 源码阅读,三千字详细分享功能函数,帮助扩展开发思维

前言 第一遍看 axios 源码&#xff0c;更多的是带着日常开发的习惯&#xff0c;时不时产生出点联想。 第二遍再看 axios 源码&#xff0c;目标明确&#xff0c;就是奔着函数来的。 当有了明确清晰的目标&#xff0c;阅读速度上来了&#xff0c;思绪也转的飞快。 按图索骥&a…

day 15 第六章二叉树

层序遍历 102.二叉树的层序遍历107.二叉树的层次遍历II199.二叉树的右视图637.二叉树的层平均值429.N叉树的层序遍历515.在每个树行中找最大值116.填充每个节点的下一个右侧节点指针117.填充每个节点的下一个右侧节点指针II104.二叉树的最大深度111.二叉树的最小深度 226.翻转二…

速腾rshelios 5515惯导时间同步

目前接触过两种雷达和惯导同步的方式&#xff1a; 1.惯导输出gprms和pps信号给米文系统&#xff0c;雷达驱动从系统里读取时间。 2.惯导输出gprms和pps信号给雷达&#xff0c;雷达驱动从雷达数据读取时间。 GPRMS和PPS的内容参考&#xff1a;STM32模拟GPS输出PPS、GPRMC与VLP…

多传感器融合定位九-基于滤波的融合方法Ⅰ其一

多传感器融合定位九-基于滤波的融合方法Ⅰ其一1. 滤波器的作用2. 概率基础知识2.1 概率、概率密度2.2 联合概率密度2.3 条件概率密度2.4 贝叶斯公式2.5 贝叶斯推断2.6 高斯概率密度函数2.7 联合高斯概率密度函数2.8 高斯随机变量的线性分布1. 滤波器的作用 滤波器的本质&#…

编译与链接------《程序员的自我修养》

本篇整理于《程序员的自我修养》一书中编译与链接相关知识&#xff0c;整理的目的是为了更加深入的了解编译于链接的更多底层知识&#xff0c;面对程序运行时种种性能瓶颈我们束手无策。我们看到的是这些问题的现象,但是却很难看清本质&#xff0c;所有这些问题的本质就是软件运…

Allegro如何使用Vertext命令修改丝印线段的形状操作指导

Allegro如何使用Vertext命令修改丝印线段的形状操作指导 在用Allegro画丝印线段的时候,如果画了一段不是自己需要形状的线段,无需删除重画,可以用Vertext命令直接编辑 如下图 修改前 修改后 具体操作如下 选择Edit

Java笔记-JUC基础

1、什么是JUC JUC指的是java.util三个并发编程工具包 java.util.concurrentjava.util.concurrent.atomicjava.util.concurrent.locks 2、线程的几种状态 public enum State{NEW,//新建RUNNABLE,//准备就绪&#xff0c;等待资源BLOCKED,//阻塞WAITING,//一直等待TIMED_WAITI…

vue脚手架 element-ui spring boot 实现图片上传阿里云 并保存到数据库

一.阿里云 注册登陆就不讲了&#xff0c;登陆进去后如下操作 1. 进入对象存储OSS 创建一个新的Bucket 随后点击新建的bucket 2.去访问RAM 前往RAM控制台 3.去创建用户 4.创建密匙 5.随后返回RAM控制台 给用户增加权限&#xff0c;文件上传所需权限&#xff0c;需要带含有…

LeetCode——1797. 设计一个验证系统

一、题目 你需要设计一个包含验证码的验证系统。每一次验证中&#xff0c;用户会收到一个新的验证码&#xff0c;这个验证码在 currentTime 时刻之后 timeToLive 秒过期。如果验证码被更新了&#xff0c;那么它会在 currentTime &#xff08;可能与之前的 currentTime 不同&am…

Java IO模型详解

文章目录Java IO模型详解一、I/O的定义1、计算机结构的视角2、应用程序的视角二、Java 中3种常见的 I/O 模型1、同步阻塞 I/O&#xff08;BIO&#xff09;2、同步非阻塞 I/O&#xff08;NIO&#xff09;★ I/O 多路复用模型3、异步非阻塞 I/O&#xff08;AIO&#xff09;Java I…

Flutter 小技巧之 3.7 更灵活的编译变量支持

今天我们聊个简单的知识点&#xff0c;在 Flutter 3.7 的 release-notes 里&#xff0c;有一个没有出现在 announcement 说明上的 change log &#xff0c;可能对于 Flutter 团队来说这个功能并不是特别重要&#xff0c;但是对于我个人而言&#xff0c;这是一个十分重要的能力补…

什么是模板方法模式?

在面向对象程序设计过程中&#xff0c;程序员常常会遇到这种情况&#xff1a;设计一个系统时知道了算法所需的关键步骤&#xff0c;而且确定了这些步骤的执行顺序&#xff0c;但某些步骤的具体实现还未知&#xff0c;或者说某些步骤的实现与具体的环境相关。例如&#xff0c;去…

阿里云国际服务器ECS特性与优势

阿里云国际服务器的 ECS 作为一种安全、可靠、灵活、可扩展的云计算服务&#xff0c;不仅可以减少运行和维护&#xff0c;而且可以提高运行和维护效率&#xff0c;使用户关注核心业务的创新。 阿里云国际服务器ECS优势一&#xff1a;产品丰富 阿里云国际云服务器 ECS 可以提供…

《MySql学习》 SQL 语句的更新过程

《MySql学习》 SQL 语句的更新过程 一.SQL查询语句的执行过程 上一篇博文记录了SQL查询语句的执行过程&#xff0c;首先客户端通过TCP三次握手与Server层的连接器建立连接&#xff08;短连接与长链接&#xff09;&#xff0c;缓存权限。然后去查询缓存&#xff08;8.0后移除&…