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

news2025/3/31 19:36:20

#### 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.coloradmin.cn/o/2323622.html

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

相关文章

融合YOLO11与行为树的人机协作智能框架:动态工效学优化与自适应安全决策

人工智能技术要真正发挥其价值&#xff0c;必须与生产生活深度融合&#xff0c;为产业发展和人类生活带来实际效益。近年来&#xff0c;基于深度学习的机器视觉技术在工业自动化领域取得了显著进展&#xff0c;其中YOLO&#xff08;You Only Look Once&#xff09;算法作为一种…

Postgresql源码(142)子查询提升pull_up_sublinks

1 案例 drop table t_fun01; create table t_fun01 (image_id numeric primary key, content_id varchar(50), file_code varchar(20)); create index idx3 on t_fun01(content_id); create index idx4 on t_fun01(file_code); insert into t_fun01 select t.i, t.i%10, t.i%1…

23种设计模式-桥接(Bridge)设计模式

桥接设计模式 &#x1f6a9;什么是桥接设计模式&#xff1f;&#x1f6a9;桥接设计模式的特点&#x1f6a9;桥接设计模式的结构&#x1f6a9;桥接设计模式的优缺点&#x1f6a9;桥接设计模式的Java实现&#x1f6a9;代码总结&#x1f6a9;总结 &#x1f6a9;什么是桥接设计模式…

【黑皮书】 AVL树

目录 前言 一 AVL树的介绍 二 单旋转 二 双旋转 总结 前言 AVL树的学习 一 AVL树的介绍 AVL树是带有平衡条件的二叉查找树&#xff0c;这个平衡条件要持续保持&#xff0c;而且必须保证树的深度为O(log(N))最简单的想法就是要求左右子树具有相同的高度 一棵AVL树是…

【机器学习】什么是决策树?

什么是决策树&#xff1f; 决策树是一种用于分类和回归问题的模型。它通过一系列的“决策”将数据逐步分裂&#xff0c;最终得出预测结果。可以把它看作是一个“树”&#xff0c;每个节点表示一个特征的判断&#xff0c;而每个分支代表了可能的判断结果&#xff0c;最终的叶子…

使用独立服务器的最佳方式指南

在寻找合适的主机服务方案时&#xff0c;可以考虑独立服务器&#xff0c;因为它拥有管理员权限以及更高的性能配置。在本指南中&#xff0c;我们将介绍独立服务器的多种用途&#xff0c;并分析为什么选择独立服务器可能是处理高性能、资源密集型应用和大流量网站的最佳方案。 搭…

【HTML 基础教程】HTML 属性

HTML 属性 属性是 HTML 元素提供的附加信息。 属性通常出现在 HTML 标签的开始标签中&#xff0c;用于定义元素的行为、样式、内容或其他特性。 属性总是以 name"value" 的形式写在标签内&#xff0c;name 是属性的名称&#xff0c;value 是属性的值。 HTML 属性 …

爬虫问题整理(2025.3.27)

此时此刻&#xff0c;困扰我一天的两个问题终于得到了解决&#xff0c;在此分享给大家。 问题1&#xff1a;使用anaconda prompt无法进行pip安装&#xff0c;这里只是一个示例&#xff0c;实际安装任何模块都会出现类似报错。 解决办法&#xff1a;关掉梯子......没错&#xf…

短信验证码安全需求设计

背景&#xff1a; 近期发现部分系统再短信充值频繁&#xff0c;发现存在恶意消耗短信额度现象&#xff0c;数据库表排查&#xff0c;发现大量非合法用户非法调用短信接口API导致额度耗尽。由于系统当初设计存在安全缺陷&#xff0c;故被不法分子进行利用&#xff0c;造成损失。…

若依专题——基础应用篇

若依搭建 搭建后端项目 ① Git 克隆并初始化项目 ② MySQL 导入与配置 ③ 启动 Redis 搭建后端项目注意事项&#xff1f; ① 项目初始化慢&#xff0c;执行clean、package ② MySQL导入后&#xff0c;修改application-druid.yml ③ Redis有密码&#xff0c;修改ap…

AI for CFD入门指南(传承版)

AI for CFD入门指南 前言适用对象核心目标基础准备传承机制 AI for CFDLibtorch的介绍与使用方法PytorchAutogluon MakefileVscodeOpenFOAMParaviewGambit 前言 适用对象 新加入课题组的硕士/博士研究生对AICFD交叉领域感兴趣的本科生实习生需要快速上手组内研究工具的合作研…

DeepSeek+RAG局域网部署

已经有很多平台集成RAG模式&#xff0c;dify&#xff0c;cherrystudio等&#xff0c;这里通过AI辅助&#xff0c;用DS的API实现一个简单的RAG部署。框架主要技术栈是Chroma,langchain,streamlit&#xff0c;答案流式输出&#xff0c;并且对答案加上索引。支持doc,docx,pdf,txt。…

个人学习编程(3-24) 数据结构

括号的匹配&#xff1a; if((s[i]) && now() || (s[i]] && now[)){ #include <bits/stdc.h>using namespace std;int main() {char s[300];scanf("%s",&s);int i;int len strlen(s);stack <char> st;for (i 0; i < len; i){if(…

面试八股文--框架篇(SSM)

一、Spring框架 1、什么是spring Spring框架是一个开源的Java平台应用程序框架&#xff0c;由Rod Johnson于2003年首次发布。它提供了一种全面的编程和配置模型&#xff0c;用于构建现代化的基于Java的企业应用程序。Spring框架的核心特性包括依赖注入&#xff08;DI&#xf…

跨语言语言模型预训练

摘要 最近的研究表明&#xff0c;生成式预训练在英语自然语言理解任务中表现出较高的效率。在本研究中&#xff0c;我们将这一方法扩展到多种语言&#xff0c;并展示跨语言预训练的有效性。我们提出了两种学习跨语言语言模型&#xff08;XLM&#xff09;的方法&#xff1a;一种…

Nodejs上传文件的问题

操作系统&#xff1a;window和linux都会遇到 软件环境&#xff1a;v20.10.0的Nodejs 1、前端代码如下&#xff1a; 2、后端Nodejs 2.1、注册接口 2.2、上传接口 其中memoryUpload方法代码如下&#xff1a; 3、用页面上传文件 查看具体报错原因&#xff1a; TypeError: sourc…

无人机螺旋桨平衡标准

螺旋桨平衡是确保无人机(UAV)平稳运行、可靠性和使用寿命的关键过程。螺旋桨的不平衡会导致振动、噪音&#xff0c;并加速关键部件的磨损&#xff0c;从而对飞行性能产生负面影响。 ISO 21940-11:2016标准为旋翼平衡提供了一个广泛引用的框架&#xff0c;定义了可接受的不平衡…

SpringBoot+策略模式+枚举类,使用配置文件改进,优雅消除if-else,完全符合OOP原则

需求分析 公司做物联网系统的&#xff0c;使用nettry进行设备连接&#xff0c;对设备进行数据采集&#xff0c;根据设备的协议对数据进行解析&#xff0c;解析完成之后存放数据库&#xff0c;但是不同厂家的设备协议不同。公司系统使用了使用了函数式编程的去写了一个解析类&am…

每日免费分享之精品wordpress主题系列~DAY16

主题介绍&#xff1a; 今日在网上寻找wordpress主题的时候逛到了大叔的网站&#xff0c;赶脚这个主题蛮不错的&#xff0c;于是百度一下&#xff0c;果然&#xff0c;这个主题很受欢迎。作为主题下载站追梦者也不甘落后&#xff0c;马上就发布出来了&#xff0c;希望对你们有用…

OpenCV图像拼接(9)实现图像拼接功能的一个高级接口cv::Stitcher

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::Stitcher 类是OpenCV中用于实现图像拼接功能的一个高级接口。它简化了从一组部分重叠的图像创建全景图的过程&#xff0c;隐藏了许多底层细节…