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.rhkb.cn/news/41796.html

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

相关文章

从零构建大语言模型全栈开发指南:第三部分:训练与优化技术-3.2.3预训练任务设计:掩码语言建模(MLM)与下一句预测(NSP)

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 3.2.3 预训练任务设计:`掩码语言建模(MLM)`与下一句预测(NSP)1. 掩码语言建模(`Masked Language Modeling, MLM`)1.1 MLM的核心原理与数学形式1.2 高级掩码优化技术1.2.1 `Span Masking(SpanBER…

DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加行拖拽排序功能示例6,TableView16_06 分页表格拖拽排序

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…

大模型训练步骤:预训练;增量预训练;微调;RLHF或者DPO

参考&#xff1a;https://blog.csdn.net/chengxuyuanyy/article/details/140949825 开发阶段分类 模型分成3个阶段: (1)、第一阶段:(Continue PreTraining)增量预训练&#xff0c;在海量领域文档数据上二次预训练GPT模型&#xff0c;以注入领域知识。 (2)、第二阶段: SFT(Sup…

多网络选择路由(windows环境)

问题 情况是这样的&#xff0c;公司环境需要连接网线才能连接内网&#xff0c;也能上网&#xff0c;但是网速贼慢&#xff0c;我就连接了自己的热点&#xff0c;但是还是很慢&#xff0c;但是一拔掉网线就快了&#xff0c;但是连不上内网环境了。 解决思路 我猜我访问外网时…

idea解决properties中文乱码

问题&#xff1a; 我的IDEA已经将文件的字符集设置成了UTF-8&#xff0c;但是中文在*.properties文件中还是会出现乱码&#xff0c;后来经同事指点修改了一项配置就ok了&#xff01;话不多说&#xff0c;看下面的对比就清楚了。 设置方法&#xff1a; Settings -> Editor…

BKA-CNN-GRU、CNN-GRU、GRU、CNN四模型多变量时序预测(Matlab)

BKA-CNN-GRU、CNN-GRU、GRU、CNN四模型多变量时序预测&#xff08;Matlab&#xff09; 目录 BKA-CNN-GRU、CNN-GRU、GRU、CNN四模型多变量时序预测&#xff08;Matlab&#xff09;预测效果基本介绍程序设计参考资料 预测效果 基本介绍 BKA-CNN-GRU、CNN-GRU、GRU、CNN四模型多…

V8内存的限制

如大家所熟悉的&#xff0c;在一般的后端开发语言中&#xff0c;在基本的内存使用上没有什么限制&#xff0c;然而在 Node 中通过JavaScript 使用内存时就会发现只能使用部分内存&#xff08;64 位系统写约 1.4GB&#xff0c;32 位系统下约为 0.7GB&#xff09;。 在这样的限制…

【RabbitMQ】

课程背景 一.初始MQ 1.同步调用 2.异步调用 1.解耦合&#xff1a;如果需要扩展业务&#xff0c;那就扩呗&#xff0c;让扩展的服务去监听消息队列就可以了 2.无需等待&#xff1a;只管发消息&#xff0c;发完就不管了&#xff0c;干别的事去了 3.故障隔离&#xff1a;接收消息…

emWin图片旋转

图片取模&#xff1a; 源码&#xff1a; /* ********************************************************************************************************* * 声明图片 *********************************************************…

ElasticSearch在Windows单节点部署及使用

文章目录 初始化ES服务下载启动验证 Kibana可视化使用ES下载启动验证使用创建第一个索引添加文档查询文档 ES优点 初始化ES服务 下载启动 访问官网https://www.elastic.co/downloads/elasticsearch 点击Windows&#xff0c;开始下载elasticsearch-8.17.4-windows-x86_64.zip…

Qt弹出新窗口并关闭(两个按钮)

参考&#xff1a;Qt基础 练习&#xff1a;弹出新窗口并关闭的两种实现方式&#xff08;两个按钮、一个按钮&#xff09;_qt打开一个窗口另一个关闭-CSDN博客 实现&#xff1a;两个按钮&#xff0c;点击第一个按钮open window打开一个新窗口&#xff0c;点击第二个窗口close wi…

今日 GitHub 热门项目大赏,你 pick 谁?

GitHub 作为全球最大的开源代码托管平台&#xff0c;每天都有无数新奇且强大的项目涌现。今天就为大家精选几个不容错过的热门项目。 微软开源 Hyperlight Wasm&#xff1a;WebAssembly 的新力量 项目地址&#xff1a;hyperlight-wasm 微软开源的 Hyperlight Wasm&#xff0c…

【区块链安全 | 第七篇】EVM概念详解

文章目录 1. EVM 概述以太坊虚拟机&#xff08;Ethereum Virtual Machine&#xff0c;EVM&#xff09;的作用EVM 如何执行智能合约账户类型 2. EVM 体系结构栈&#xff08;Stack&#xff09;内存&#xff08;Memory&#xff09;存储&#xff08;Storage&#xff09;Gas 机制 3.…

【C++】AVL树

目录 前言平衡二叉树的定义AVL树的插入AVL树插入的大致过程更新平衡因子调整最小不平衡因子左单旋右单旋左右双旋右左双旋 AVL树的删除AVL树的查找 前言 前面我们在数据结构中学习了树&#xff0c;以及二叉树&#xff0c;还有二叉排序树&#xff0c;这节来学习平衡二叉树。 数…

【洛谷题单】暴力枚举(上)

【前情提要】 此文章包含洛谷题单的枚举题单&#xff0c;共14题&#xff0c;本篇7道题&#xff0c;主要分析思路&#xff0c;并通过这几道题目&#xff0c;进行总结有关枚举的内容。所以内容比较多&#xff0c;可以先收藏起来&#xff0c;慢慢看。 题单链接&#xff1a;暴力枚…

JVM类加载过程详解

文章目录 前言1.加载2.链接验证文件格式验证元数据验证字节码验证符号引用验证 准备解析 3.初始化4.类卸载 前言 类从被加载到虚拟机内存中开始到卸载出内存为止&#xff0c;它的整个生命周期可以简单概括为 7 个阶段&#xff1a;加载&#xff08;Loading&#xff09;、验证&a…

python之并发编程

并发编程介绍 串行、并行与并发的区别 进程、线程、协程的区别 1. 进程 (Process) 定义&#xff1a;进程是操作系统为运行中的程序分配的基本单位。每个进程都有独立的地址空间和资源&#xff08;如内存、文件句柄等&#xff09;。特点&#xff1a; 进程是资源分配的基本单位…

批量优化与压缩 PPT,减少 PPT 文件的大小

我们经常能够看到有些 PPT 文档明明没有多少内容&#xff0c;但是却占用了很大的空间&#xff0c;存储和传输非常的不方便&#xff0c;这时候通常是因为我们插入了一些图片/字体等资源文件&#xff0c;这些都可能会导致我们的 PPT 文档变得非常的庞大&#xff0c;今天就给大家介…

centos 7 LVM管理命令

物理卷&#xff08;PV&#xff09;管理命令 pvcreate&#xff1a;用于将物理磁盘分区或整个磁盘创建为物理卷。 示例&#xff1a;sudo pvcreate /dev/sdb1 解释&#xff1a;将 /dev/sdb1 分区创建为物理卷。 pvdisplay&#xff1a;显示物理卷的详细信息&#xff0c;如大小、所属…

b站视频提取mp4方案

引言 对于b站视频&#xff0c;有些视频是不能提取字幕的&#xff0c;所以我们想把对应的视频下载下来&#xff0c;然后进行对应的本地处理&#xff0c;获得所需的自由处理&#xff0c;吞食视频。 整体思路 下载b站客户端 ----> 把缓存路径修改------> 下载所需视频---…