Elasticsearch初识之脚本查询附加示例代码(script)

概念

Scripting是Elasticsearch支持的一种专门用于复杂场景下支持自定义编程的强大的脚本功能,ES支持多种脚本语言,如painless,其语法类似于Java,也有注释、关键字、类型、变量、函数等,其就要相对于其他脚本高出几倍的性能,并且安全可靠,可以用于内联和存储脚本。

支持的语言

  1. groovy:ES 1.4.x-5.0的默认脚本语言

  2. painless:JavaEE使用java语言开发,.Net使用C#/F#语言开发,Flutter使用Dart语言开发,同样,ES 5.0+版本后的Scripting使用的语言默认就是painless,painless是一种专门用于Elasticsearch的简单,用于内联和存储脚本,是ES 5.0+的默认脚本语言,类似于Java,也有注释、关键字、类型、变量、函数等,是一种安全的脚本语言。并且是Elasticsearch的默认脚本语言。

  3. 其他

    expression:每个文档的开销较低:表达式的作用更多,可以非常快速地执行,甚至比编写native脚本还要快,支持javascript语法的子集:单个表达式。缺点:只能访问数字,布尔值,日期和geo_point字段,存储的字段不可用

    mustache:提供模板参数化查询

特点

  1. 语法简单,学习成本低

  2. 灵活度高,可编程能力强

  3. 性能相较于其他脚本语言很高

  4. 安全性好

  5. 独立语言,虽然易学但仍需单独学习

  6. 相较于DSL性能低

  7. 不适用于复杂的业务场景

应用场景

各种复杂的应用场景,如自定义评分、自定义聚合查询等。

正则:

早先某些版本正则表达式默认情况下处于禁用模式,因为它绕过了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非常缓慢###

代码示例

POST product/_update/2
{"script": {"source": "ctx._source.price-=1"}
}
POST product/_update/2
{"script": {"source": "ctx._source.price-=ctx._version"}
}
#简写
POST product/_update/2
{"script": "ctx._source.price-=1"
}
​
# Scripting的CRUD
POST _reindex
{"source": {"index": "product"},"dest": {"index": "product2"}
}
​
# 举个例子:华为出了新款 新增了tag 叫做“遥遥领先”
POST product/_update/6
{"script": {"lang": "painless","source": "ctx._source.tags.add('遥遥领先')"}
}
#upsert update + insert 
POST product/_update/3
{"script": {"lang": "painless","source": "ctx._source.price += 100"},"upsert": {"name" : "huaweimate60","desc" : "yyds","price" : 1999}
}
​
#GET查询 painless expression 应用于促销打折计算
GET product/_search
{"script_fields": {"my_price": {"script": {"lang": "expression","source": "doc['price'].value* 0.9"}}}
}
GET product/_search
{"script_fields": {"my_price": {"script": {"lang": "painless","source": "doc['price'].value* 0.9"}}}
}
#参数化
POST product/_update/2
{"script": {"lang": "painless","source": "ctx._source.tags.add(params.tag_name)","params": {"tag_name":"无线秒充"}}
}
​
GET product/_search
{"script_fields": {"my_price": {"script": {"lang": "painless","source": "doc['price'].value* params.num","params": {"num": 9 }}}}
}
#多个折扣
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}}}}
}
​
# Stored scripts   scripts模板
# /_scripts/{id}
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}}}}
}
​
#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"}}
}
​
#正则like %小米% /[\s\S]*小米[\s\S]*/
POST product/_update/3
{"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"}"""}
}
#统计所有价格小于1000的商品的tag的数量 不考虑重复的情况
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;"""}}}}
}
​
# 对于一些早期版本 script.painless.regex.enabled: true
# doc['field'].value 和 params['_source']['field']
​
#批量新增
PUT test_index/_bulk?refresh
{"index":{"_id":1}}
{"ajbh": "12345","ajmc": "立案案件","lasj": "2020/05/21 13:25:23","jsbax_sjjh2_xz_ryjbxx_cleaning": [{"XM": "张三","NL": "30","SF": "男"},{"XM": "李四","NL": "31","SF": "男"},{"XM": "王五","NL": "30","SF": "女"},{"XM": "赵六","NL": 23,"SF": "男"}]}
{"index":{"_id":2}}
{"ajbh": "563245","ajmc": "结案案件","lasj": "2020/05/21 13:25:23","jsbax_sjjh2_xz_ryjbxx_cleaning": [{"XM": "张三2","NL": "30","SF": "男"},{"XM": "李四2","NL": "31","SF": "男"},{"XM": "王五2","NL": "30","SF": "女"},{"XM": "赵六2","NL": "23","SF": "女"}]}
{"index":{"_id":3}}
{"ajbh": "12345","ajmc": "立案案件","lasj": "2020/05/21 13:25:23","jsbax_sjjh2_xz_ryjbxx_cleaning": [{"XM": "张三3","NL": "30","SF": "男"},{"XM": "李四3","NL": "31","SF": "男"},{"XM": "王五3","NL": "30","SF": "女"},{"XM": "赵六3","NL": "23","SF": "男"}]}
​
#统计男性嫌疑人的数量
GET test_index/_search
GET product/_search
#Object Nested
GET /test_index/_search
{"aggs": {"sum_person": {"sum": {"script": {"lang": "painless","source": """int total = 0;for(int i = 0;i< params['_source']['jsbax_sjjh2_xz_ryjbxx_cleaning'].length;i++){if(params['_source']['jsbax_sjjh2_xz_ryjbxx_cleaning'][i]['SF']=='男'){total+=1;}}return total;"""}}}}
}

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

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

相关文章

计算机基础(存储单位)

1. 计算机中的存储单位有哪些 1.1 常见的计算机存储单位 计算机存储单位一般用bit、B、KB、MB、GB、TB、PB、EB、ZB、YB、BB、NB、DB……来表示&#xff0c;如下所示&#xff1a; bit位、比特byte&#xff08;B&#xff09;字节、字Kill Byte&#xff08;KB&#xff09;千字…

VSCode 搭建Java开发环境

笔者使用最多的语言是C&#xff0c;也使用过不少其它语言&#xff0c;像Erlang&#xff0c;Python&#xff0c;Lua&#xff0c;C#等等&#xff0c;目前项目中在使用Go&#xff0c;但是没使用过Java。最近看到C#夺冠&#xff0c;首次荣获 TIOBE 年度编程语言&#xff0c;同时也看…

拯救者y9000p安装linux、windows双系统。

首先需要准备启动盘 我用的是Win32DiskImager来做的。资源使用的是ubuntu-20.04.6-desktop-amd64.iso。别用低版本&#xff0c;失败很多次之后的教训。 磁盘管理-磁盘分区-右键-压缩卷 这边分区出来之后&#xff0c;不要分配。安装时候会自动分配的。 重启之后F2进去BIOS设置…

np.polyfit

np.polyfit 是 NumPy 库中用于多项式拟合的函数。这个函数用于拟合一组数据点到一个多项式模型&#xff0c;返回多项式系数。 具体来说&#xff0c;np.polyfit(x, y, deg) 接受三个参数&#xff1a; x: 数据点的 x 坐标。y: 数据点的 y 坐标。deg: 多项式的阶数。 函数返回一…

Vue 中 watch监听器的使用

0. 含义&#xff1a; 在Vue.js中&#xff0c;watch是一个选项&#xff0c;用于监听数据的变化并执行相应的操作。watch提供了一种在数据变化时执行异步或开销较大的操作的机制&#xff0c;以及对一些复杂的数据变化情况做出响应。 1. 简单写法 data: {name: 静静,obj: {hobb…

DEJA_VU3D - Cesium功能集 之 114-雷达效果(基础效果)

前言 编写这个专栏主要目的是对工作之中基于Cesium实现过的功能进行整合,有自己琢磨实现的,也有参考其他大神后整理实现的,初步算了算现在有差不多实现小140个左右的功能,后续也会不断的追加,所以暂时打算一周2-3更的样子来更新本专栏(每篇博文都会奉上完整demo的源代码…

使用ArduinoMqttClient库连接阿里云,并实现发送接收数据(ESP8266)

文章目录 引言一、MQTT理论部分二、使用MQTT.fx接入物联网设备三、使用ESP8266连接阿里云四、参考例程 引言 阿里云物联网平台的接入方式有很多种&#xff0c;从阿里云提供的开发文档可以看到&#xff0c;支持的接入协议有MQTT、HTTPS、CoAP、JT/808、GB/32960协议等等&#x…

算法训练营Day40(动态规划)

今天两题都挺有难度&#xff0c;建议大家思考一下没思路&#xff0c;直接看题解&#xff0c;第一次做&#xff0c;硬想很难想出来。 343. 整数拆分 343. 整数拆分 - 力扣&#xff08;LeetCode&#xff09; 理解难度大&#xff0c;但学完其实很简单 class Solution {public …

数据库悲观锁 select for update的详解

一 作用 1.1 结论 在mysql中&#xff0c;select ... for update 仅适用于InnoDB&#xff0c;且必须在事务块中才能生效。Innodb引擎默认是行锁。 Select .... from where .... for update 如果在where的查询条件字段使用了【主键|索引】&#xff0c;则此命令上行锁。否…

2024,传统鞋服的“高端梦”该醒了

文 | 螳螂观察 作者 | 图霖 “一千块都不要的波司登&#xff0c;宝贝们还不冲吗&#xff1f;” 入夜&#xff0c;一位身着羽绒服的美女主播在灯火通明的直播间正声嘶力竭地反复呐喊。 一群不知是托还是真实消费者的用户在评论区敲出自己的身高体重&#xff0c;想从主播那得…

【打卡】牛客网:BM81 买卖股票的最好时机(二)

与BM80 买卖股票的最好时机(一)的区别是&#xff0c;可以多次买&#xff0c;但是卖完才能再买。 我的想法是&#xff0c;对于第i天的价格&#xff0c;j从第0天~第i-1天的价格遍历&#xff0c;即&#xff0c;【第j天买入、今天卖出的利润】【第j-1天的利润】&#xff0c;遍历&a…

单链表与循环链表创建

链表 struct List {int data;struct List* next; }创建链表 单链表 实现 struct List* listCreate() {int data;struct List* head NULL;struct List* pre NULL;struct List* current NULL;while(scanf("%d",&data) && data ! -1){current (stru…

【计算机组成原理】IEEE 754 标准定义的浮点数表示格式

IEEE 754 IEEE 754是一种由美国电气和电子工程师协会&#xff08;IEEE&#xff09;制定的标准&#xff0c;用于定义浮点数的表示和运算。这个标准定义了浮点数的格式、舍入规则、特殊值的处理以及算术操作的执行方式。 IEEE 754浮点数标准主要定义了两种浮点数格式&#xff1…

基于LVGL编写的windows串口工具: LCOM

LCOM: Serial Port Tools based on LVGL (PC Software) 一直以来我都想用LVGL做一个真正意义上的PC软件&#xff0c;来验证或者表达LVGL出色的特性&#xff0c;现在我用LCOM做到了&#xff01; LCOM 是一个基于LVGL编写的串口工具&#xff0c;界面简洁&#xff0c;功能出色&a…

Javaweb之SpringBootWeb案例查询部门以及前后端联调的详细解析

2.1 查询部门 2.1.1 原型和需求 查询的部门的信息&#xff1a;部门ID、部门名称、修改时间 通过页面原型以及需求描述&#xff0c;我们可以看到&#xff0c;部门查询&#xff0c;是不需要考虑分页操作的。 2.1.2 接口文档 部门列表查询 基本信息 请求路径&#xff1a;/depts …

235.【2023年华为OD机试真题(C卷)】机器人搬砖(二分查找-JavaPythonC++JS实现)

🚀点击这里可直接跳转到本专栏,可查阅顶置最新的华为OD机试宝典~ 本专栏所有题目均包含优质解题思路,高质量解题代码(Java&Python&C++&JS分别实现),详细代码讲解,助你深入学习,深度掌握! 文章目录 一. 题目二.解题思路三.题解代码Python题解代码JAVA题解…

Github项目推荐-Insomnia

项目地址 GitHub地址&#xff1a;GitHub - Kong/insomnia 官网&#xff1a;The Collaborative API Development Platform - Insomnia 项目简述 想必大家都知道PostMan吧。Insomnia可以说是PostMan的开源平替。页面ui很不错&#xff0c;功能强大&#xff0c;使用也比较方便。…

Matlab 字符识别OCR实验

Matlab 字符识别实验 图像来源于屏幕截图&#xff0c;要求黑底白字。数据来源是任意二进制文件&#xff0c;内容以16进制打印输出&#xff0c;0-9a-f’字符被16个可打印字符替代&#xff0c;这些替代字符经过挑选&#xff0c;使其相对容易被识别。 第一步进行线分割和字符分割…

C++设计模式-- 2.代理模式

文章目录 代理模式 代理模式 代理模式的定义&#xff1a;为其他对象提供一种代理以控制对这个对象的访问。在某些情况下&#xff0c;一个对象不适合 或不能直接引用另一个对象&#xff0c;而代理对象可以在客户端和目标对象之间起到中介的作用。 代理模式有以下三种角色&…

ES分词器

Analysis&#xff1a;文本分析是把全文本转换一系列单词的过程&#xff0c;也叫分词。Analysis是通过Analyzer(分词器)来实现的。 1.Analyzer组成 注意&#xff1a;在ES中默认使用标准分词器&#xff1a;StandardAnalyzer。特点是&#xff1a;中文是单字分词&#xff0c;英文是…