Elasticsearch-脚本查询
脚本查询
-
概念
Scripting是Elasticsearch支持的一种专门用于复杂场景下支持自定义编程的强大的脚本功能,ES支持多种脚本语言,如painless,其语法类似于Java,也有注释、关键字、类型、变量、函数等,其就要相对于其他脚本高出几倍的性能,并且安全可靠,可以用于内联和存储脚本。
-
支持的语言
-
groovy:ES 1.4.x-5.0的默认脚本语言
-
painless:JavaEE使用java语言开发,.Net使用C#/F#语言开发,Flutter使用Dart语言开发,同样,ES 5.0+版本后的Scripting使用的语言默认就是painless,painless是一种专门用于Elasticsearch的简单,用于内联和存储脚本,是ES 5.0+的默认脚本语言,类似于Java,也有注释、关键字、类型、变量、函数等,是一种安全的脚本语言。并且是Elasticsearch的默认脚本语言。
-
其他:
expression:每个文档的开销较低:表达式的作用更多,可以非常快速地执行,甚至比编写native脚本还要快,支持javascript语法的子集:单个表达式。缺点:只能访问数字,布尔值,日期和geo_point字段,存储的字段不可用
mustache:提供模板参数化查询
-
-
特点
- 语法简单,学习成本低
- 灵活度高,可编程能力强
- 性能相较于其他脚本语言很高
- 安全性好
- 独立语言,虽然易学但仍需单独学习
- 相较于DSL性能低
- 不适用于复杂的业务场景
-
应用场景:各种复杂的应用场景,如自定义评分、自定义聚合查询等。
-
正则:
早先某些版本正则表达式默认情况下处于禁用模式,因为它绕过了painless的针对长时间运行和占用内存脚本的保护机制。而且有深度对战行为。如果需要开启正则,需要配置:script.painless.regex.enabled: true
注意:通常正则的使用范围比较小,应用范围基本限制在数据量比较小和并发量比较小的应用场景下。
-
doc[‘field’].value和params[‘_source’][‘field’]:
理解之间的区别是很重要的,doc[‘field’].value和params[‘_source’][‘field’]。首先,使用doc关键字,将导致该字段的条件被加载到内存(缓存),这将导致更快的执行,但更多的内存消耗。此外,doc[…]符号只允许简单类型(不能返回一个复杂类型(JSON对象或者nested类型)),只有在非分析或单个词条的基础上有意义。但是,doc如果可能,使用仍然是从文档访问值的推荐方式,因为_source每次使用时都必须加载并解析。使用_source非常缓慢
脚本查询-实战教程
1、对索引中的数据进行修改
价格减一
POST product/_update/2
{"script": {"source": "ctx._source.price-=1"}
}小米10出了新款 新增了tag 叫做“无线充电”
POST product/_update/6
{"script": {"lang": "painless","source": "ctx._source.tags.add('无线充电')"}
}
2、将文档从一个索引复制到另一个索引。它允许用户将数据从一个索引重新索引到另一个索引
POST _reindex
{"source": {"index": "product"},"dest": {"index": "product2"}
}
3、删除索引中的数据
执行delete操作
POST product/_update/10
{"script": {"lang": "painless","source": "ctx.op='delete'"}
}
4、upsert有则更新否则插入
POST product/_update/19
{"script": {"lang": "painless","source": "ctx._source.price += 100"},"upsert": {"name" : "小米手机10","desc" : "充电贼快掉电更快,超级无敌望远镜,高刷电竞屏","price" : 1999}
}
5、参数化操作索引数据
POST product/_update/6
{"script": {"lang": "painless","source": "ctx._source.tags.add(params.tag_name)","params": {"tag_name":"无线秒充"}}
}
6、对索引数据进行多次操作
GET product/_search
{"script_fields": {"price": {"script": {"lang": "painless","source": "doc['price'].value"}},"discount_price": {"script": {"lang": "painless","source": "[doc['price'].value* params.discount_8,doc['price'].value* params.discount_7,doc['price'].value* params.discount_6,doc['price'].value* params.discount_5]","params": {"discount_8": 0.8,"discount_7": 0.7,"discount_6": 0.6,"discount_5": 0.5}}}}
}
7、模板脚本
#创建脚本模板
POST _scripts/calculate_discount
{"script": {"lang": "painless","source": "doc.price.value * params.discount"}
}
#查看
GET _scripts/calculate_discount
#使用模板进行数据运算
GET product/_search
{"script_fields": {"price": {"script": {"lang": "painless","source": "doc['price'].value"}},"discount_fields": {"script": {"id": "calculate_discount","params": {"discount":0.8}}}}
}
8、函数式编程
#Scripting的函数式编程
GET product/_search
GET product/_doc/1
POST product/_update/1
{"script": {"lang": "painless","source": "ctx._source.tags.add(params.tag_name)","params": {"tag_name":"无线秒充"}}
}POST product/_update/1
{"script": {"lang": "painless","source": """ctx._source.tags.add(params.tag_name);ctx._source.price-=100;""","params": {"tag_name":"无线秒充1"}}
}
9、正则表达式
#正则like %小米% /[\s\S]*小米[\s\S]*/
POST product/_update/4
{"script": {"lang": "painless","source": """if(ctx._source.name ==~ /[\s\S]*小米[\s\S]*/) {ctx._source.name+="***|"}else{ctx.op="noop"}"""}
}
#/\d{4}-\d{2}-\d{2}[\s\S]*/
GET product/_doc/1
POST product/_update/1
{"script": {"lang": "painless","source": """if(ctx._source.createtime ==~ /\d{4}-\d{2}-\d{2}[\s\S]*/) {ctx._source.name+="|***"}else{ctx.op="noop"}"""}
}
10、聚合查询一起使用
GET product/_search
#统计所有价格小于1000的商品的tag的数量 不考虑重复的情况
GET product/_mapping
GET product/_search
{"query": {"constant_score": {"filter": {"range": {"price": {"lte": 1000}}}}},"aggs": {"tag_agg": {"sum": {"script": {"lang": "painless","source": """int total = 0;for(int i = 0; i <doc['tags.keyword'].length; i++){total++;}return total;"""}}}}
}

相关文章:
Elasticsearch-脚本查询
脚本查询 概念 Scripting是Elasticsearch支持的一种专门用于复杂场景下支持自定义编程的强大的脚本功能,ES支持多种脚本语言,如painless,其语法类似于Java,也有注释、关键字、类型、变量、函数等,其就要相对于其他脚本高出几倍的性…...
《Opencv》基础操作详解(3)
接上篇:《Opencv》基础操作详解(2)-CSDN博客 Opencv基础操作 目录 Opencv基础操作 18、图像边界填充 19、阈值处理(图像的二值化) 20、图像平滑处理 (1)、均值滤波(Mean Filte…...
meshy的文本到3d的使用
Meshy官方网站: 中文官网: Meshy官网中文站 编辑 Opens in a new window 编辑www.meshycn.com Meshy AI 中文官网首页 英文官网: Meshy目前似乎还没有单独的英文官网,但您可以在中文官网上找到英文界面或相关英文资料。 链…...
C语言技巧之有条件的累加
什么叫有条件的累加? 主要是依靠循环,一般形式是一个在循环里面遍历,另一个只有达到一定的条件才会累加(移动到下一个变量),从言语也能看出来,主要是用在字符串和数组里面的,毕竟链表…...
解释为什么fetch(JavaScript)无法将读取的数据存入外部变量
(一)问题描述 你可能会遇到这样的情况:在fetch之外创建变量,将fetch获取到的数据赋值给这个变量以便在fetch外使用,但在使用这个变量的时候发现值是空的,这是为什么呢? (二…...
Windows Subsystem for Linux (WSL)
目录 定义与功能 版本与特点 应用场景 启用 WSL 功能 更新WSL及其内核 下载Linux发行版本 WSL(Windows Subsystem for Linux)是微软在Windows 10和Windows 11中引入的一项功能,使用户能够在Windows上原生运行Linux的命令行工具和应用程…...
Go的Slice如何扩容
在Go语言中,slice(切片)是一个动态数组,其底层实现是基于数组,但提供了更灵活的长度和容量管理。当向slice中添加元素并超出其当前容量时,Go会自动为其分配一个更大的底层数组,并复制现有元素到…...
使用云计算开发App 有哪些坑需要避免
当我们在云计算环境下开发App时,往往会觉得一切都变得“轻松”了。毕竟,云计算提供了无限的计算资源、灵活的存储方案,还有自动化的服务,仿佛有了一个万能的工具箱,啥都能搞定。可是,别被这种“轻松”外表骗…...
ARM 架构--通用寄存器状态寄存器控制寄存器特殊用途寄存器
目录 一?ARM 架构中的寄存器 ARM 架构中的寄存器 通用寄存器 状态寄存器 控制寄存器 特殊用途寄存器 总结 二 通用寄存器 ARM 架构中的通用寄存器 ARMv7 架构 ARMv8 架构 实例 ARMv7 架构 ARMv8 架构 三 状态寄存器 ARM 架构中的状态寄存器 状态寄存器 详细…...
最新SQL Server 2022保姆级安装教程【附安装包】
目录 一、安装包下载: 下载链接:https://pan.quark.cn/s/b1c0c63d61ec 二、安装SQL Server 1.下载安装包后解压出来,双击打开 2.等待加载安装程序 3.点击基本安装 4.点击接受 5.点击浏览 6.在D盘新建文件夹 7.命名为【Sql Server】…...
学习C++:运算符
运算符 作用:用于执行代码的运算 一,算数运算符 作用:用于处理四则运算 (在除法运算中,除数不可以为0) 两个小数不可以做取模运算 (只有整型变量可以进行取模运算) 二࿰…...
pdf有密码,如何实现pdf转换word?
PDF想要转换成其他格式,但是当我们将文件拖到PDF转换器进行转换的时候发现PDF文件带有密码怎么办?今天分享PDF有密码如何转换成word方法。 方法一、 PDF文件有两种密码,打开密码和限制编辑,如果是因为打开密码,建议使…...
AI发展新态势:从技术突破到安全隐忧
AI安全的新挑战 近期AI领域出现了令人担忧的新发现。根据最新研究,AI模型已经开始展现出策略性欺骗的倾向。具体表现在以下几个方面: 策略性欺骗行为的出现 在实验中发现,当研究人员试图让AI执行一些"反Anthropic"的操作时(如获取模型权限和外部服务器访问),模…...
王佩丰24节Excel学习笔记——第二十二讲:制作甘特图与动态甘特图
【以 Excel2010 系列学习,用 Office LTSC 专业增强版 2021 实践】 【本章技巧】 插入图表,针对每一个图表上的元素,都可以选中选右键进行修改数据;本章中的向两端延伸,设置数据的原理;数据格式的显示方式&…...
若依框架之简历pdf文档预览功能
一、前端 (1)安装插件vue-pdf:npm install vue-pdf (2)引入方式:import pdf from "vue-pdf"; (3)components注入方式:components:{pdf} (4&…...
酷瓜云课堂(内网版)v1.1.8 发布,局域网在线学习平台方案
更新layui-v2.9.20文章复用课程期限优化编辑器内容自动提交联系方式增加抖音二维码修正课时详情页目录高亮问题修正CommentInfo中点赞判断精简AccountSearchTrait优化kg_h5_index_url()优化CourseUserTrait优化kg_setting()优化CsrfToken 系统介绍 酷瓜云课堂内网版ÿ…...
python语音机器人(青云客免费api)
强调:不用登录注册,直接使用就好 青云客智能聊天机器人API python代码,直接可以运行: 1、安装库: pip install requests pyttsx3 SpeechRecognition sounddevice numpy scipy2、完整代码: import request…...
使用ArcGIS/ArcGIS pro绘制六边形/三角形/菱形渔网图
在做一些尺度分析时,经常会涉及到对研究区构建不同尺度的渔网进行分析,渔网的形状通常为规则四边形。构建渔网的方法也很简单,使用ArcGIS/ArcGIS Pro工具箱中的【创建渔网/CreateFishnet】工具来构建。但如果想构建其他形状渔网进行相关分析&…...
5.系统学习-PyTorch与多层感知机
PyTorch与多层感知机 前言PyTroch 简介张量(Tensor)张量创建张量的类型数据类型和 dtype 对应表张量的维度变换:张量的常用操作矩阵或张量计算 Dataset and DataLoaderPyTorch下逻辑回归与反向传播数据表格 DNN(全连结网络&#x…...
AIGC与虚拟身份及元宇宙的未来:虚拟人物创作与智能交互
个人主页:云边有个稻草人-CSDN博客 目录 引言 一、AIGC在元宇宙中的作用 1.1 AIGC与虚拟人物创作 1.1.1 生成虚拟人物外观 1.1.2 个性化虚拟角色设计 1.2 AIGC与虚拟角色的行为与交互 1.2.1 行为生成与强化学习 1.2.2 对话生成与自然语言处理 二、AIGC实现…...
阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...
Python训练营-Day26-函数专题1:函数定义与参数
题目1:计算圆的面积 任务: 编写一个名为 calculate_circle_area 的函数,该函数接收圆的半径 radius 作为参数,并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求:函数接收一个位置参数 radi…...
【HarmonyOS 5】鸿蒙中Stage模型与FA模型详解
一、前言 在HarmonyOS 5的应用开发模型中,featureAbility是旧版FA模型(Feature Ability)的用法,Stage模型已采用全新的应用架构,推荐使用组件化的上下文获取方式,而非依赖featureAbility。 FA大概是API7之…...
