es 3期 第27节-运用Script脚本实现复杂需求

#### 1.Elasticsearch是数据库,不是普通的Java应用程序,传统数据库需要的硬件资源同样需要,提升性能最有效的就是升级硬件。
#### 2.Elasticsearch是文档型数据库,不是关系型数据库,不具备严格的ACID事务特性,任何企图直接替代严格事务性场景的应用项目都会失败!!!
#### 3.Elasticsearch原则上适合一切非事务性应用场景或能够容许一定的延迟的事务性场景;能最大限度的替代mongodb与传统关系型数据库

##### 索引字段与属性都属于静态设置,若后期变更历史数据需要重建索引才可生效
##### 对历史数据无效!!!!
##### 一定要重建索引!!!!

#### 1、Script概要介绍
### Script概念
## 概念解释
# ES的脚本类同传统数据库的UDF,可以自定义一些规则表达式,目的是满足日益复杂的应用需求
# Greenplum,支持Python/R
## 应用便利
# 支持灵活多变的应用场景与需求如:字段数值乘以10倍数

### 参数
# script,定义脚本查询入口
# lang,定义脚本语言
# source,定义脚本内容
# id,脚本编号名称,预定义脚本
# params,定义脚本参数,全局参数

# eg 乘以10
GET kibana_sample_data_flights/_search
{"query":{"match_all": {}},"script_fields":{"AvgTicketPrice_100":{"script":{"lang": "expression","source": "doc['AvgTicketPrice']*10"}}}
}

### Script脚本类型
## 脚本类型
# 1.Painless,最丰富的强大的脚本语言
# 2.Lucene,简洁高效的原生lucene脚本语言
# 3.Mustache,简洁高效的template脚本语言
# 4.Java,原生支持iava高级自定义的脚本语言


### Script获取上下文数据值
## 获取上下文数据值
# 1.update script,数据更新上下文获取数据
# 2._score,数据分值
# 3.doc_value,从列式获取数据值
# 4._source,从原数据中获取数据值
# 5._store,从lucene存储中获取数据值

# update script,eg 从Script获取数据,更新字段值
GET kibana_sample_data_flights_3share/_search
POST kibana_sample_data_flights_3share/_update_by_query
{"script":{"source": """ctx._source.FlightNum=ctx._source.OriginCountry + "_"+ctx._source.FlightNum"""}
}
GET kibana_sample_data_flights_3share/_search# _score,eg 从Script获取数据,修改分值
GET kibana_sample_data_flights_3share/_search
{"query": {"function_score": {"query": {"match": {"Origin": "Newark"}},"script_score": {"script": {"lang": "expression","source": "_score*doc['FlightTimeMin']"}}}}
}# doc_value,eg 从Script获取数据,修改分值
GET kibana_sample_data_flights_3share/_search
{"query": {"function_score": {"query": {"match": {"Origin": "Newark"}},"script_score": {"script": {"lang": "expression","source": "doc['FlightTimeMin']*10"}}}}
}
# _source,eg 从Script获取数据,更新字段值
GET kibana_sample_data_flights_3share/_search
POST kibana_sample_data_flights_3share/_search
{"script_fields": {"FlightNum": {"script": {"lang": "painless","source": "params._source.FlightNum+'_'+ params._source.OriginCityName"}}}
}# _store, eg 从lucene-store中获取数据
# 创建索引时需要设定store=true,否则出错
PUT dev-001
{"mappings":{"properties":{"devName":{"type":"text","store":true},"devDesc":{"type":"text","store":true}}}
}
POST dev-001/_doc
{"devName":"设备名称-1","devDesc":"设备描述内容"
}
GET dev-001/_search
{"stored_fields":["*"],"script_fields":{"devInfo":{"script":{"lang": "painless","source": "params._fields['devName'].value+'_'+params._fields['devDesc'].value"}}}
}

### 脚本接口(扩展了解)
## script_context
# 查询脚本执行支持的上下文参考

GET _script_context

## _script_language
# 查询内置已经注册脚本语言类型
# 内置脚本语言支持的上下文

GET _script_language


### scripts 创建
# 创建内置脚本,便于编译,提升执行能力
# *PUT _scripts/<script-id>
# *POST _scripts/<script-id>
# *PUT _scripts/<script-id>/<context>
# *POST _scripts/<script-id>/<context>

#### 2、Lucene脚本应用
## Lucene概要介绍
# 1.继承Lucene原生,简洁高效,表达能力有限
# 2.官方名称:expression
## 其它能力
# 1.性能最好

## expression, eg
# Lucene,继承原生lucene内置能力,性能好,简洁直接,性能同比其它,最好
# 查询参数
# lang,定义查询语言类型
# expression,lucene 语言类型
# doc,获取参数

# 获取日期的一天中的小时
GET kibana_sample_data_flights/_search
{"_source": ["timestamp"],"track_total_hits": true,"script_fields": {"hourOfDay": {"script": {"lang": "expression","source": "doc['timestamp'].date.hourOfDay"}}}
}
## 限制性条件
# 仅能获取数值、日期、geo_point类型

#### 3、Mustache脚本应用
# 基于 Mustache 模板语法规则,简单适用
# 查询模板

GET _search/template
{"source": {"query": {"match": {"{{my_field}}": "{{my_value}}"}},"size": "{{my_size}}"},"params": {"my_field": "message","my_value":"foo","my_size":10}
}

#### 4、Painless脚本应用深入探查
## 概要介绍
# 1.基于自定义脚本规则,语言语法参考python/java,简洁高效,语言能力丰富。
# 2.Painless是编译模型,基于ANTLR4与ASM库编译
# 3.内置沙箱机制,非常安全
# https://github.com/antlr/antlr4
# https://zhuanlan.zhihu.com/p/575048391

## 查询参数
# lang,定义查询语言类型
# painless,查询语言
# source,查询语言表达式

# eg
GET kibana_sample_data_flights/_search
{"query":{"match_all": {}},"script_fields":{"AvgTicketPrice_100":{"script":{"lang": "expression","source": "doc['AvgTicketPrice']*10"}}}
}

### scripts/painless/_execute 测试接口
## 查询参数
# POST /scripts/painless/execute
# script,脚本表达式定义
# context,上下文逻辑表达式
# context_setup,上文参数,指定索引与字段替代等

## test-context
# 默认测试上下文
# 测试自定义变量

# eg 1
POST /_scripts/painless/_execute
{"script": {"source":"params.count/params.total","params": {"count":11.0,"total":1100.0}}
}# eg 2
POST /_scripts/painless/_execute
{"script": {"source":"""int i=10;float f=(float)i;float i_f=i*f;return i_f*params.p1;""","params": {"p1": 100,"p2": 1000}}
}

## filter-context
# 过滤上下文,查询逻辑表达式
# bool 表达式

# eg 
POST /_scripts/painless/_execute
{"script": {"source":"""int i=10;float f=(float)i;float i_f=i*f;float f1= i_f*params.p1;return f1<doc['AvgTicketPrice'].value;""","params": {"p1": 100,"p2": 1000}},"context":"filter","context_setup":{"index":"kibana_sample_data_flights","document":{"AvgTicketPrice":100.11}}
}

## score-context
# 数值上下文  

# eg 
POST /_scripts/painless/_execute
{"script": {"source":"""int i=10;float f=(float)i;float i_f=i*f;float f1= i_f*params.p1;return f1+doc['AvgTicketPrice'].value;""","params": {"p1": 100,"p2": 1000}},"context":"score","context_setup":{"index":"kibana_sample_data_flights","document":{"AvgTicketPrice":100.11}}
}

### 限制性条件
## 性能限制
# 脚本语言越复杂,性能原则上越差
## 权限限制
# 脚本执行是在沙箱中进行,不能超过java 或者 es 权限限制边界,如禁止访问 IO 等
  
  
  
#### 5、Java脚本应用自定义能力探查
## 当以上3种脚本无法满足特定诉求,可以基于java 语言自定义构造特殊的脚本,如需要突破IO 访问限制
## 或者与其它框架集成等

## eg 
# 1、编写java插件 ExpertScriptPlugin.java
# 参考官方案例
# https://www.elastic.co/guide/en/elasticsearch/reference/8.6/modules-scripting-engine.html

# 2、编译运行包
# 基于 gradle 构件程序包
# jar包位置:elasticsearch-8.6.2\plugins\examples\script-expert-scoring\build\distrlbutions

# 3、复制到 Plugins 目录
# 例如我的目录是D:\Software\elasticsearch-8.6.2
# 进该目录下的plugins文件夹,这个文件夹默认是空的,在plugins下创建一个插件目录
# 将自己的jar复制进来

# 4、新增配置文件
#  新增配置文件plugin-descriptor.properties
#(可以在elasticsearch-8.6.2\modules\x-pack-async目录下拷一份过来改改)


# 重启es,通过_script_language查看支持的脚本,比原先多一个
GET _script_language

## 官方插件原代码位置
# elasticsearch-8.6.2\plugins\examples\script-expert-scoring\src\main\java\org\elasticsearch\example\expertscript\ExpertScriptPlugin.java


  
#### 6、Script应用场景
### 应用场景
# 脚本应用场景
# 查询:query
# 自定义字段:script_field
# 排序:sort
# 聚合:aggs
# 上卷:transform
# 分值:scrore
  
  
  
  
#### 7、Script经验分享与总结
# 选择合适的脚本
# 注意脚本性能问题
  
  
# scripting 脚本模块
# https://www.elastic.co/guide/en/elasticsearch/reference/8.6/modules-scripting.html
# lucene-expressions 语法参考
# https://www.elastic.co/guide/en/elasticsearch/reference/8.6/modules-scripting-expression.html
# lucene-expressions 官方参考
# https://lucene.apache.org/core/8_8_2/expressions/index.html?org/apache/lucene/expressions/js/package-summary.html
# painless 语言参考
# https://www.elastic.co/guide/en/elasticsearch/painless/8.6/index.html
# painless-execute-api 测试接囗
# https://www.elastic.co/guide/en/elasticsearch/painless/8.6/painless-execute-api.html
# search-template 查询模板
# https://www.elastic.co/guide/en/elasticsearch/reference/8.6/search-template.html
# Java 脚本插件
# https://www.elastic.co/guide/en/elasticsearch/reference/8.6/modules-scripting-engine.html
# script-apis 执行接口
# https://www.elastic.co/guide/en/elasticsearch/reference/8.6/script-apis.html
# mapping-fields 索引元数据参考
# https://www.elastic.co/guide/en/elasticsearch/reference/8.6/mapping-fields.html

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

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

相关文章

23、web前端开发之html5(四)

十二. HTML5实践示例 前面我们详细讲解了HTML5的特点&#xff0c;包括语义化标签、增强的表单功能、多媒体元素&#xff08;如<video>和<audio>&#xff09;、Canvas绘图、SVG集成以及离线存储等。以下是一些详细的HTML5实践示例&#xff0c;展示如何使用HTML5的新…

海思烧录工具HITool电视盒子刷机详解

HiTool是华为开发的一款用于海思芯片设备的刷机和调试工具&#xff0c;可对搭载海思芯片的机顶盒、智能电视等设备进行固件烧录、参数配置等操作。以下为你详细介绍&#xff1a; 功能用途 固件烧录&#xff1a;这是HiTool最主要的功能之一。它能够将下载好的适配固件文件烧录到…

软考中级-软件设计师 23种设计模式(内含详细解析)

23种设计模式 &#x1f3af; 创建型设计模式&#x1f4cc; 抽象工厂&#xff08;Abstract Factory&#xff09; 设计模式&#x1f4cc; 工厂方法&#xff08;Factory Method&#xff09;设计模式&#x1f4cc; 单例&#xff08;Singleton&#xff09;设计模式&#x1f4cc; 生成…

thinkphp8.0\swoole的websocket应用

环境&#xff1a;centOS7.9、php8.3、thinkphp8.0\think-swoole4.1 我用的官方think-swoole插件 第一步&#xff1a;根据官方文档&#xff0c;需要安装此扩展插件 composer require topthink/think-swoole 第二步&#xff1a;在根目录下config文件夹下编辑swoole.php配置文…

Ubuntu服务器挂载时遇到文件系统错误怎么办

在Ubuntu服务器上挂载分区时&#xff0c;如果遇到文件系统错误&#xff0c;通常可能是由于磁盘损坏、文件系统损坏、不正确的卸载等原因造成的。以下是详细的排查与修复步骤&#xff1a; 一、查看错误信息 首先&#xff0c;尝试手动挂载并观察具体错误&#xff1a; sudo mount …

【设计模式】策略模式(Strategy Pattern)详解

策略模式&#xff08;Strategy Pattern&#xff09;详解 一、策略模式的定义 策略模式&#xff08;Strategy Pattern&#xff09;是一种行为型设计模式&#xff0c;它定义了一组算法&#xff0c;将每个算法封装起来&#xff0c;并使它们可以相互替换&#xff0c;从而让算法的…

软考笔记5——软件工程基础知识

第五章节——软件工程基础知识 软件工程基础知识 第五章节——软件工程基础知识一、软件工程概述1. 计算机软件2. 软件工程基本原理3. 软件生命周期4. 软件过程 二、软件过程模型1. 瀑布模型2. 增量模型3. 演化模型&#xff08;原型模型、螺旋模型)4. 喷泉模型5. 基于构建的开发…

Vim 实用指南

导航 简介Vim 的来历Vim 语言 Vim 的三种模式Normal&#xff08;普通模式&#xff09;Insert&#xff08;插入模式&#xff09;Visual&#xff08;可视模式&#xff09;三种模式转换 普通模式实用技巧说明复制当前行并粘贴使用上一个命令撤销上一个操作最常用的跳转命令查找对应…

Git入门——常用指令汇总

以下是一份精心整理的 Git常用指令速查表&#xff0c;基本覆盖日常开发使用场景&#xff0c;建议收藏备用&#x1f447; &#x1f527; 环境配置 指令作用git config --global user.name "你的名字"设置全局用户名git config --global user.email "你的邮箱&qu…

常见中间件漏洞攻略-Jboss篇

一、CVE-2015-7501-Jboss JMXInvokerServlet 反序列化漏洞 第一步&#xff1a;开启靶场 第二步&#xff1a;访问该接口&#xff0c;发现直接下载&#xff0c;说明接⼝开放&#xff0c;此接⼝存在反序列化漏洞 http://47.103.81.25:8080/invoker/JMXInvokerServlet 第三步&…

播放本地视频-实现视频画廊功能

实现一个视频画廊&#xff0c;播放本地视频 可以切换不同视频的功能 文章目录 需求&#xff1a;场景实现方案遇到的坑播放器选择界面显示不全视频友好显示问题缓存 总结 需求&#xff1a; 实现一个视频画廊&#xff0c;播放本地视频 可以切换不同视频的功能 场景 图片画廊的…

从零构建大语言模型全栈开发指南:第二部分:模型架构设计与实现-2.2.2文本生成逻辑:Top-k采样与温度控制

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 2.2.2 文本生成逻辑:Top-k采样与温度控制1. 文本生成的核心挑战与数学框架1.1 自回归生成的基本流程2. `Top-k`采样原理与工程实现2.1 数学定义与算法流程2.2 PyTorch实现优化3. 温度控制的数学本质与参…

为什么后端接口返回数字类型1.00前端会取到1?

这得从axios中得默认值说起&#xff1a; Axios 的 transformResponse axios 在接收到服务器的响应后&#xff0c;会通过一系列的转换函数&#xff08;transformResponse&#xff09;来处理响应数据&#xff0c;使其适合在应用程序中使用。默认情况下&#xff0c;axios 的 tran…

【C++游戏引擎开发】《线性代数》(2):矩阵加减法与SIMD集成

一、矩阵加减法数学原理 1.1 定义 ​逐元素操作:运算仅针对相同位置的元素,不涉及矩阵乘法或行列变换。​交换律与结合律: 加法满足交换律(A + B = B + A)和结合律( ( A + B ) + C = A + ( B + C ) )。 ​减法不满足交换律(A − B ≠ B − A)。1.2 公式 ​ C i j = …

openGauss关联列数据类型不一致引起谓词传递失败

今天分享一个比较有意思的案例 注意&#xff1a;因为原始SQL很长&#xff0c;为了方便排版&#xff0c;简化了SQL 下面SQL跑60秒才出结果&#xff0c;客户请求优化 select dtcs.owner, dtcs.table_name, dtcs.column_name, dct.commentsfrom dba_tab_columns dtcsleft outer j…

01 相机标定与相机模型介绍

学完本文,您将了解不同相机模型分类、内参意义,及对应的应用代码模型 标定的意义 建模三维世界点投影到二维图像平面的过程。标定输出的是相机模型。 相机模型 相机模型可以解理解为投影模型 +

Hyperlane:Rust Web开发的未来,释放极致性能与简洁之美

Hyperlane&#xff1a;Rust Web开发的未来&#xff0c;释放极致性能与简洁之美 你是否厌倦了复杂的Web框架&#xff0c;想要一个既高效又易用的工具来构建现代Web应用&#xff1f;Hyperlane正是你需要的答案&#xff01;作为专为Rust打造的轻量级、高性能HTTP服务器库&#xf…

STM32学习笔记之振荡器(原理篇)

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…

Stereolabs ZED Box Mini:机器人与自动化领域的人工智能视觉新选择

在人工智能视觉技术快速发展的今天&#xff0c;其应用场景正在持续拓宽&#xff0c;从智能安防到工业自动化&#xff0c;从机器人技术到智能交通&#xff0c;各领域都在积极探索如何利用这一先进技术。而 Stereolabs 推出的ZED Box Mini&#xff0c;正是一款专为满足这些多样化…

K8S学习之基础五十九:部署gitlab服务

部署gitlab docker pull gitlab/gitlab-ce:latest docker tag gitlab/gitlab-ce:latest 172.16.80.140/gitlab/gitlab-ce:latest docker push 172.16.80.140/gitlab/gitlab-ce:latest docker run -d -p 443:443 -p 80:80 -p 222:22 --name gitlab --restart always -v /home/…