elasticsearch 使用Painless脚本

文章目录

      • 1. 创建索引
      • 2. 插入模拟数据
      • Painless 脚本的基本特点:
      • Painless 脚本的常见用途
      • 1. 脚本查询和过滤
        • 示例:基于脚本的查询
      • 2. 脚本字段
        • 示例:脚本字段
      • 3. 聚合中的脚本
        • 示例:脚本聚合
      • 4. 文档更新中的脚本
        • 示例:文档更新
      • 5. 排序中的脚本
        • 示例:脚本排序
      • Painless 脚本的常见用法和注意事项
        • 1. **访问字段**
        • 2. **参数传递**
        • 3. **条件判断**
        • 4. **限制**
        • 5. **调试脚本**
      • 总结

1. 创建索引

首先,我们可以创建一个包含适当字段的 products 索引,并定义字段的映射(mapping)。例如,我们可以使用 text 类型来存储产品名称,keyword 类型来存储分类,floatdouble 类型来存储价格、评分和折扣。

PUT /products
{"mappings": {"properties": {"product_name": {"type": "text"},"price": {"type": "float"},"category": {"type": "keyword"},"rating": {"type": "float"},"discount": {"type": "float"},"availability": {"type": "boolean"},"stock": {"type": "integer"},"release_date": {"type": "date"}}}
}

2. 插入模拟数据

接下来,我们插入一些模拟产品数据到 products 索引。以下是一些数据样本:

POST /products/_doc/1
{"product_name": "Apple iPhone 15","price": 999.99,"category": "Smartphones","rating": 4.5,"discount": 0.1,"availability": true,"stock": 50,"release_date": "2023-09-01"
}POST /products/_doc/2
{"product_name": "Samsung Galaxy S24","price": 899.99,"category": "Smartphones","rating": 4.3,"discount": 0.05,"availability": true,"stock": 30,"release_date": "2023-10-10"
}POST /products/_doc/3
{"product_name": "Dell XPS 13","price": 1199.99,"category": "Laptops","rating": 4.8,"discount": 0.15,"availability": true,"stock": 20,"release_date": "2023-08-20"
}POST /products/_doc/4
{"product_name": "Sony WH-1000XM5","price": 349.99,"category": "Headphones","rating": 4.7,"discount": 0.2,"availability": false,"stock": 0,"release_date": "2023-06-15"
}POST /products/_doc/5
{"product_name": "Apple MacBook Air","price": 999.00,"category": "Laptops","rating": 4.6,"discount": 0.1,"availability": true,"stock": 15,"release_date": "2023-11-01"
}POST /products/_doc/6
{"product_name": "Fitbit Charge 5","price": 149.99,"category": "Wearables","rating": 4.4,"discount": 0.05,"availability": true,"stock": 80,"release_date": "2023-07-10"
}

在 Elasticsearch 中,Painless 是一种用于查询和聚合操作的内置脚本语言。它被设计为高效、安全、且易于使用的脚本语言,用于在 Elasticsearch 中执行动态计算。Painless 可以在许多不同的场景中使用,比如在 查询过滤器聚合文档更新排序脚本字段 等操作中动态计算值。

Painless 脚本的基本特点:

  • 高效:Painless 脚本会经过优化,执行速度较快。
  • 安全:Painless 会在执行过程中检查潜在的安全问题,防止执行恶意代码。
  • 易用:语法简洁,类似于 Java,但也有一些简化和限制。

Painless 脚本的常见用途

  1. 脚本查询和过滤
  2. 脚本字段
  3. 聚合中的脚本
  4. 文档更新
  5. 排序

1. 脚本查询和过滤

你可以使用 Painless 脚本来动态计算查询条件。例如,假设你要查询文档中的字段 price 是否大于某个动态值:

示例:基于脚本的查询
POST /products/_search
{"query": {"script_score": {"query": {"match_all": {}},"script": {"source": "doc['price'].value > params.threshold ? 1 : 0","params": {"threshold": 1000}}}}
}

在这个查询中,script_score 根据 price 字段的值与 threshold 参数进行比较,只有当 price > 1000 时,文档才会匹配查询。
在这里插入图片描述

2. 脚本字段

Painless 脚本可以用于计算查询结果中的 脚本字段,允许你在查询结果中添加基于其他字段计算的动态值。

示例:脚本字段

假设每个文档都有 pricetax 字段,你想在查询结果中计算每个文档的总价(price + tax)。

POST /products/_search
{"query": {"match_all": {}},"script_fields": {"total_price": {"script": {"lang": "painless","source": "doc['price'].value + doc['discount'].value"}}}
}

这将为每个文档添加一个名为 total_price 的字段,字段值是 price + discount 的和。

在这里插入图片描述

3. 聚合中的脚本

Painless 脚本还可以用在聚合操作中,用于对字段值进行动态计算。例如,基于某个条件计算总和或平均值。

示例:脚本聚合

假设你想计算所有产品的 price 字段的加权平均值,其中权重来自于另一个字段 rating

POST /products/_search
{"size": 0,"aggs": {"weighted_avg_price": {"avg": {"script": {"lang": "painless","source": "doc['price'].value * doc['rating'].value"}}}}
}

在这个例子中,weighted_avg_price 聚合会计算 price * rating 的平均值。
在这里插入图片描述

4. 文档更新中的脚本

Painless 脚本可以用来动态更新文档中的字段。这在批量更新或修改文档时非常有用,特别是当更新的内容需要基于现有字段的值进行计算时。

示例:文档更新

假设你有一个文档中存储了 pricediscount 字段,现在你想要根据 discount 更新 price

POST /products/_update/1
{"script": {"lang": "painless","source": "ctx._source.price = ctx._source.price - (ctx._source.price * ctx._source.discount)"}
}

在这个例子中,price 字段会根据 discount 字段的值进行折扣更新。
在这里插入图片描述

5. 排序中的脚本

你可以使用 Painless 脚本对搜索结果进行动态排序。例如,假设你要根据一个计算出来的值进行排序,而这个值是由多个字段计算得出的。

示例:脚本排序

假设你有 ratingprice 字段,你想按照 rating 除以 price 的结果对文档进行排序:

POST /products/_search
{"query": {"match_all": {}},"sort": [{"_script": {"type": "number","script": {"lang": "painless","source": "doc['rating'].value / doc['price'].value"},"order": "desc"}}],"script_fields": {"rating_to_price_ratio": {"script": {"lang": "painless","source": "doc['rating'].value / doc['price'].value"}}}
}

在这个例子中,文档将按照 rating / price 的值进行降序排序。

在这里插入图片描述


Painless 脚本的常见用法和注意事项

1. 访问字段

在 Painless 中,你可以使用 doc['field_name'].value 来访问字段的值。如果字段是多值字段,你可以使用 doc['field_name'].values 来获取所有的值。

  • 对于文本字段:doc['text_field'].value 返回的是字段的一个值(如果该字段为多值字段,Painless 默认取第一个值)。
  • 对于数字字段:可以像上面的示例那样直接访问数字字段。
2. 参数传递

你可以通过 params 来传递外部参数到脚本中,这样就能在脚本中动态使用这些值。

{"query": {"range": {"price": {"gte": "{{params.min_price}}"}}},"params": {"min_price": 100}
}

在这里,params.min_price 是传递给脚本的参数。

3. 条件判断

Painless 支持基本的条件判断,比如 if 语句。可以用来执行基于条件的计算。

{"script": {"lang": "painless","source": """if (doc['discount'].size() != 0) {return doc['price'].value - (doc['price'].value * doc['discount'].value);} else {return doc['price'].value;}"""}
}

这个脚本判断如果 discount 字段存在,就对 price 进行折扣计算,否则返回原价。

4. 限制
  • 性能:虽然 Painless 被设计成高效的,但大量的动态计算会对性能产生一定的影响。尽量避免在查询或聚合中使用过于复杂的脚本,尤其是在大规模数据集上。
  • 沙盒环境:Painless 是运行在沙盒环境中的,意味着它的功能被严格限制,无法进行一些危险的操作,如文件操作、网络请求等。
5. 调试脚本

Painless 脚本支持调试输出,可以在开发时利用 _explain 或者调试日志来查看脚本的执行情况。

总结

Painless 是 Elasticsearch 中强大且高效的脚本语言,广泛应用于查询、更新、聚合、排序等多种操作。通过使用 Painless 脚本,开发者可以对 Elasticsearch 的行为进行细粒度的控制和动态计算,从而实现更灵活的功能。

在实际应用中,合理使用 Painless 脚本能够帮助解决复杂的数据计算需求,但也需要注意性能和安全性,避免过度使用脚本影响集群性能。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jmeter CLI Mode 传参实现动态设置用户数

一.需求 CLI 运行模式下每次运行想要传入不同的用户数,比如寻找瓶颈值的场景,需要运行多次设置不同的用户数。 二.解决思路 查看官方API Apache JMeter - Users Manual: Getting Started api CLI Mode 一节中提到可以使用如下参数做属性的替换&#…

【Java Nio Netty】基于TCP的简单Netty自定义协议实现(万字,全篇例子)

基于TCP的简单Netty自定义协议实现(万字,全篇例子) 前言 有一阵子没写博客了,最近在学习Netty写一个实时聊天软件,一个高性能异步事件驱动的网络应用框架,我们常用的SpringBoot一般基于Http协议&#xff0…

小程序播放设备没有声音

使用在使用小程序播放设备时没有声音请按照以下步骤排查 1、确认设备是否开启麦克风 设备的本地配置页面可以查看麦克风的开启状态,也可以通过其他方式播放检查是否有声音,比如萤石app或者ezuikit,若其他端播放有声音说明设备的麦克风已开启 …

【考前预习】3.计算机网络—数据链路层

往期推荐 【考前预习】2.计算机网络—物理层-CSDN博客 【考前预习】1.计算机网络概述-CSDN博客 浅谈云原生--微服务、CICD、Serverless、服务网格_云原生cicd-CSDN博客 子网掩码、网络地址、广播地址、子网划分及计算_子网广播地址-CSDN博客 浅学React和JSX-CSDN博客 目录 1.数…

bean创建源码

去字节面试,直接让人出门左拐:Bean 生命周期都不知道! spring启动创建bean流程 下面就接上了 bean生命周期 doGetBean Object sharedInstance this.getSingleton(beanName); sharedInstance this.getSingleton(beanName, new ObjectF…

iOS swift开发系列 -- tabbar问题总结

1.单视图如何改为tabbar,以便显示2个标签页 右上角➕,输入tabbar 找到控件,然后选中,把entrypoint移动到tabbar控件 2.改成tabbar,生成两个item,配置各自视图后,启动发现报错 Thread 1: “-[p…

【常考前端面试题总结】---2025

React fiber架构 1.为什么会出现 React fiber 架构? React 15 Stack Reconciler 是通过递归更新子组件 。由于递归执行,所以更新一旦开始,中途就无法中断。当层级很深时,递归更新时间超过了 16ms,用户交互就会卡顿。对于特别庞…

直流开关电源技术及应用

文章目录 1. 开关电源概论1.1 开关电源稳压原理1.1.1 开关电源稳压原理核心组成部分及其作用工作过程稳压原理 1. 开关电源概论 1.1 开关电源稳压原理 为了提高效率,必须使功率调整器件处于开关工作状态。 作为开关而言,导通时压降很小,几乎…

汽车嵌入式软件构建高效技术团队的全面思考

在汽车嵌入式软件开发领域,构建一支高效的通用技术团队至关重要。这类团队负责为各种项目提供可复用、标准化的技术基石,从而提高开发效率、降低成本并确保产品质量。构建这样的团队需要从技术能力、角色分工、标准化与复用、流程管理与质量保证、工具和…

SpringBoot左脚进门之Maven管理家

一、概念 Maven 是一个项目管理和整合工具。通过对 目录结构和构建生命周期 的标准化, 使开发团队用极少的时间就能够自动完成工程的基础构建配置。 Maven 简化了工程的构建过程,并对其标准化,提高了重用性。 Maven 本地仓库 (Local Reposi…

活动报名:Voice Agent 开发者分享会丨RTE Meetup

引入 voice agent 的口语学习应用 Speak 估值已达 10 亿美元 Voice Agent 开发者分享会 一同探索语音驱动的下一代人机交互界面,一场 voice agent builder 的小规模深度交流会。 RTE Meetup 迎来第六期!12 月 15 日(周日)上午&…

gentoo安装Xfce桌面

一、安装Xfce 1.选择一个配置文件 参见另一篇“https://blog.csdn.net/my1114/article/details/143919066”,配置文件选择24. 2.安装Xfce (1)root #emerge --ask xfce-base/xfce4-meta 第一次启动登录后时可能还需starx来启动X11 (2)安装slim(X11登录管理…

舌头分割数据集labelme格式2557张1类别

数据集格式:labelme格式(不包含mask文件,仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数):2557 标注数量(json文件个数):2557 标注类别数:1 标注类别名称:["tongue"] 每个类别标注的框数&#xff1…

【提升工作能力:五大关键要素】

提升工作能力:五大关键要素 在职场中,工作能力强的员工往往能够更高效地完成任务,赢得同事的尊重和领导的信任。那么,如何提升自己的工作能力呢?根据上述内容,我们可以将提升工作能力的关键要素归纳为以下…

【Linux服务器nginx前端部署详解】ubantu22.04,前端Vue项目dist打包

本文主要讲一下在Linux系统环境下(以ubantu22.04为例),如何用nginx部署前端Vue项目打包的dist静态资源。有些具体的命令就不展开讲了,可以自行查看其他博主的文章,我主要讲整体的步骤和思路。 一、ubantu系统安装ngin…

(后序遍历 简单)leetcode 101翻转二叉树

将根结点的左右结点看作 两个树的根结点,后序遍历(从叶子结点从下往上遍历) 两个树边遍历边比较。 左节点就左右根的后序遍历 右根结点就右左根的后序遍历来写 后序遍历(从叶子结点从下往上遍历) /*** Definition …

【Google Cloud】VPC Service Controls 的试运行模式

本文介绍了 VPC 服务控制的试运行模式。 什么是 VPC Service Controls VPC Service Controls 是 Google Cloud(以前称为 GCP)的一项安全功能。它通过设置一个被称为 边界 的逻辑围栏,防止从内部到外部和从外部到内部的双向意外访问&#xf…

NAT网络地址转化技术

1.什么是NAT NAT技术是一种将自己内网的多个私有IP地址转换为一个公网IP进行访问互联网的一项技术,这个技术主要是用来解决IPv4地址不够的问题。 2.NAT技术的具体例子 如果我们用手机使用流量浏览一个网站,那么第一步手机会对这个域名进行DNS解析&#…

图形几何之美系列:铺装算法效果赏析

你知道怎么设置地砖排布吗?或者墙砖排布 有一块布料,怎么填充好看的纹理? 可以用铺装算法,使得设计和艺术变得更有创造力 轮廓铺装:地板铺装、墙砖铺砖、吊顶铺装、图案填充。 图案变得更具艺术感~电视机&#xff1f…

Tomcat项目本地部署

前言: 除了在idea中将项目启动之外,也可以将项目部署在本地tomcat或者云服务器上,本片文章主要介绍了怎样将项目部署在本地tomcat 下面介绍如何使用Tomcat部署本地项目: 1、本篇文章使用的项目案例为一个聚合项目,ha…