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.pswp.cn/news/899296.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/899296.shtml
英文地址,請注明出處:http://en.pswp.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/…