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.mzph.cn/news/889906.shtml

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

相关文章

【Elasticsearch】高亮搜索:从原理到Web呈现

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…

15.初始接口1.0 C#

这是一个用于实验接口的代码 适合初认识接口的人 【CSDN开头介绍】(文心一言AI生成) 在C#编程世界中,接口(Interface)扮演着至关重要的角色,它定义了一组方法,但不提供这些方法的实现。接口作为…

Day9 神经网络的偏导数基础

多变量函数与神经网络 在神经网络中,我们经常遇到多变量函数。这些函数通常描述了网络的输入、权重、偏置与输出之间的关系。例如,一个简单的神经元输出可以表示为: z f ( w 1 x 1 w 2 x 2 … w n x n b ) z f(w_1x_1 w_2x_2 \ldots…

map和set题目练习

一、习题一:随机链表的复制 1.1题目详情 1.2思路 在没有学习map和set之前,解决这道题最大的问题就在于无法建立原链表与拷贝链表的映射关系,只能通过在原链表每个节点后面新建一个新的链表来进行节点间的对应,而学习了map之后&a…

C语言入门(一):A + B _ 基础输入输出

前言 本专栏记录C语言入门100例,这是第(一)例。 目录 一、【例题1】 1、题目描述 2、代码详解 二、【例题2】 1、题目描述 2、代码详解 三、【例题3】 1、题目描述 2、代码详解 四、【例题4】 1、题目描述 2、代码详解 一、【例…

渗透测试学习笔记(五)网络

一.IP地址 1. IP地址详解 ip地址是唯一标识,一段网络编码局域网(内网):交换机-网线-pcx.x.x.x 32位置2进制(0-255) IP地址五大类 IP类型IP范围A类0.0.0.0 到 127.255.255.255B类128.0.0.0 到191.255.25…

《自制编译器》--青木峰郎 -读书笔记 编译hello

在该书刚开始编译hello.cb时就遇到了问题。 本人用的是wsl,环境如下, 由于是64位,因此根据书中的提示,从git上下载了64位的cb编译器 cbc-64bit 问题一: 通过如下命令编译时,总是报错。 cbc -Wa,"--32" -Wl,"-…

jedis使用及注意事项

Jedis Jedis 是一个 Java 客户端,用于与 Redis 数据库进行交互。它提供了一系列简单易用的 API,使得在 Java 应用程序中使用 Redis 变得非常方便。以下是 Jedis 的使用方法及一些注意事项。 Jedis的优势 Lettuce客户端及Jedis客户端比较如下:…

浏览器执行机制

主线程 任务1,任务2 微队列微队列任务1, 微队列任务2延时队列延时队列任务1, 延时队列任务2交互队列.... 事件循环的工作原理 主线程执行同步任务: 主线程首先执行所有同步任务(即栈中的任务)。这些任务会…

Java 基础知识——part 4

8.成员方法:Java中必须通过方法才能对类和对象的属性操作;成员方法只在类的内部声明并加以实现。一般声明成员变量后再声明方法。 9.方法定义 方法的返回值是向外界输出的信息,方法类型和返回值类型同;返回值通过return返回&…

C/S软件授权注册系统(Winform+WebApi+.NET8+EFCore版)

适用软件:C/S系统、Winform桌面应用软件。 运行平台:Windows .NETCore,.NET8 开发工具:Visual Studio 2022,C#语言 数据库:Microsoft SQLServer 2012,Oracle 21c,MySQL8&#xf…

监控易 IDC 数据中心一体化智能运维平台:新质生产力的典范

一、引言 在当今数字化飞速发展的时代,IDC 数据中心作为信息产业的核心基础设施,其稳定、高效运行对于企业和社会的重要性不言而喻。随着数据量的爆炸式增长和业务复杂度的提升,传统的运维模式已难以满足需求,数据中心面临着诸多挑…

busybox学习——简单介绍

文章目录 简介官网源码目录结构构建 简介 BusyBox 将许多具有共性的小版本的UNIX工具结合到一个单一的可执行文件。这样的集合可以替代大部分常用工具比如的GNU fileutils , shellutils等工具,BusyBox提供了一个比较完善的环境,可以适用于任…

CTFHUB 信息泄露 备份文件下载-网站源码

根据提示应是猜测网站源码的备份文件,可以采用bp拼接文件名和后缀 开启bp抓包后设置第一个攻击点导入文件名 第二个攻击点导入后缀 开始暴力破解,有成功响应的 拼接到网站后缀后可以直接下载 解压缩后记事本的名字就是flag 总结: …

Latex 转换为 Word(使用GrindEQ )(英文转中文,毕业论文)

效果预览 第一步: 告诉chatgpt: 将latex格式中的英文翻译为中文(符号和公式不要动),给出latex格式第二步: Latex 转换为 Word(使用GrindEQ ) 视频 https://www.bilibili.com/video/BV1f242…

X射线衍射全岩分析在岩石学研究中的重要性

X射线衍射全岩分析在岩石学研究中的重要性 X射线衍射(XRD)全岩分析在岩石学研究中扮演着至关重要的角色,它是一种非破坏性的分析技术,能够提供岩石和矿物的精细结构信息。通过解析材料内部原子排列的特征,XRD不仅揭示了…

【Bolt.new + PromptCoder】三分钟还原油管主页

【Bolt.new PromptCoder】三分钟还原油管主页 PromptCoder官网:PromptCoder Bolt官网:https://bolt.new/ Bolt 是什么? Bolt.new 是一个提供创建全栈网络应用服务的平台。它允许用户通过提示(Prompt)、运行&#x…

定时/延时任务-万字解析Spring定时任务原理

文章目录 1. 概要2. EnableScheduling 注解3. Scheduled 注解4. postProcessAfterInitialization 解析4.1 createRunnable 5. 任务 Task 和子类6. ScheduledTaskRegistrar6.1 添加任务的逻辑6.2 调度器初始化6.3 调用时机 7. taskScheduler 类型7.1 ConcurrentTaskScheduler7.2…

JumpServer开源堡垒机搭建及使用

目录 一,产品介绍 二,功能介绍 三,系统架构 3.1 应用架构 3.2 组件说明 3.3 逻辑架构 3.3 逻辑架构 四,linux单机部署及方式选择 4.1 操作系统要求(JumpServer-v3系列版本) 4.1.1 数据库 4.1.3创建数据库参考 4.2 在线安装 4.2.1 环境访问 4.3 基于docker容…

ResNet网络:深度学习中的革命性架构

目录 ​编辑 引言 ResNet网络的特点 1. 残差块(Residual Block) 2. 恒等映射(Identity Mapping) 3. 深层网络训练 4. Batch Normalization 5. 全局平均池化 6. 灵活的结构 ResNet的应用案例 ResNet的研究进展 实战案例…