ES 27 - Elasticsearch腳本的使用實踐

来源:https://www.cnblogs.com/shoufeng/archive/2019/08/15/11360177.html
-Advertisement-
Play Games

Elasticsearch中的腳本(script)有什麼作用? 如何創建、搜索、使用腳本? 腳本的緩存又是什麼? 對於腳本的使用, 有哪些高效的實踐策略? 本篇博文對這些內容作個簡單的探討. ...


目錄

本文以 ES 6.6.0 版本為例進行演示.

1 關於腳本

ES提供了腳本支持 —— 可以通過Groovy外置腳本(已過時)、內置painless腳本實現各種複雜操作.

—— painless有輕便之意, 使用時直接在語法中調用即可, 無需外置, 也就是不支持通過外部文件存儲painless腳本並調用的方法.

// 向ES中插入一條數據:
PUT employee/developer/1
{
    "name": "shou feng", 
    "age": 20,
    "salary": 10000
}
  
// 通過GET發送腳本, 允許為每個匹配的文檔返回腳本評估(script evaluation)內容: 
GET employee/_search
{
    "script_fields": {
        "change_age_field": {   // 該欄位不存在 - script fields可以處理未存儲的欄位
            "script": {
                "lang":   "expression",
                "source": "doc['age'] * multiplier",  // 獲取age欄位的值進行計算
                "params": {
                    "multiplier": 2
                }
            }
        }
    }
}

// 響應結果為: 
{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "employee",
        "_type" : "developer",
        "_id" : "1",
        "_score" : 1.0,
        "fields" : {
          "change_age_field" : [
            40.0
          ]
        }
      }
    ]
  }
}

2 腳本使用的最佳實踐

Elasticsearch第一次載入一個新腳本時, 會將新腳本編譯並存儲在緩存中.

編譯可能是一個繁重的過程, 如果需要將變數傳遞給腳本, 建議: 將它們作為命名參數傳遞給腳本本身(方式①), 而不是硬編碼在腳本中(方式②).

(1) 方式① 參數傳遞:

"source": "doc['age'] * multiplier",
"params": {
    "multiplier": 2
}

(2) 方式② 硬編碼:

"source": "doc['age'] * 2"

(3) 優劣對比:

  • 每次乘數改變時都必須重新編譯第②個版本, 而第①個版本只編譯一次.

  • 如果短時間內編譯過多的腳本, ES將拒絕帶有circuit_breaking_exception錯誤的新腳本.

  • Elasticsearch預設情況下, 每分鐘最多編譯15個內聯腳本, 可以通過修改 script.max_compilations_rate 的值來更改此設置.

2.1 創建腳本並存儲

可以使用_scripts API 將腳本存儲在集群狀態中, 並從集群狀態中檢索腳本.

使用_scripts/{id}的方式操作腳本, 具體步驟如下:

(1) 首先在集群狀態中創建名為calculate-score的腳本:

POST _scripts/calculate-score
{
    "script": {
        "lang": "painless",
        "source": "Math.log(_score * 2) + params.my_modifier"
    }
}

(2) 檢索存儲的腳本:

GET _scripts/calculate-score

(3) 通過腳本id使用已創建的腳本:

GET _search
{
    "query": {
        "script": {
            "script": {
                "id": "calculate-score",
                "params": {
                    "my_modifier": 2    // 傳遞腳本所需的參數
                }
            }
        }
    }
}

(4) 刪除腳本:

DELETE _scripts/calculate-score

2.2 腳本的緩存

預設情況下, 所有的腳本都會被緩存到ES集群中, 因此只有當腳本被更新之後, ES才會重新編譯它們.

同樣, 腳本沒有過期時間的說法, 但可以使用script.cache.expire設置更改過期時間.

也可以使用script.cache.max_size配置此腳本緩存的大小, 預設緩存大小為100.

存儲腳本的大小限製為65535位元組, 可以通過 script.max_size_in_bytes來更改, 但是如果腳本非常大, 就應該考慮相關腳本的實現引擎是否足夠優秀.

2.3 Script Field - 腳本欄位

腳本欄位還可以通過訪問_source欄位來提取文檔的其他欄位 —— 使用params ['_source']提取要從中獲取的內容.

比如訪問_source元欄位中message欄位的內容, 可以用: "script": "params['_source']['message']"訪問.

另外: 理解doc['my_field'].valueparams['_source']['my_field']之間的區別非常重要:

① 使用doc關鍵字: 將導致該欄位的術語載入到記憶體(緩存)中, 這樣腳本的執行速度會更快, 但也會帶來更多的記憶體消耗. 另外, doc […]符號只允許簡單的值欄位(不能從中返回JSON對象), 並且它只對非分析或基於單個術語的欄位有意義.

② 使用params關鍵字: 每次使用時都必須載入和解析_source, 這是非常緩慢的.

建議: 使用doc關鍵字, 從文檔中訪問相關欄位的值, 這種方式更加高效.


參考資料

ES 6.6 官方文檔 - How to use scripts

版權聲明

作者: 馬瘦風(https://healchow.com)

出處: 博客園 馬瘦風的博客(https://www.cnblogs.com/shoufeng)

感謝閱讀, 如果文章有幫助或啟發到你, 點個[

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • mysql MySQL語法MySQL採用結構化查詢語言SQL (Structured Query Language)語言來操作資料庫SQL語句必須以 ; 結束SQL語句分類DDL(數據定義語言): create、drop、alter、truncateDQL(數據查詢語言): select、showD ...
  • 安裝參考 https://www.cnblogs.com/onezg/p/8768597.html 安裝參考 https://www.cnblogs.com/onezg/p/8768597.html 我當時安裝的是Oracle 12c Release 1(Version 12.1.0.1.0,64位 ...
  • 既然程式最終都被變成了一條條機器碼去執行,那為什麼同一個程式,在同一臺電腦上,在Linux下可以運行,而在Windows下卻不行呢? 反過來,Windows上的程式在Linux上也是一樣不能執行的 可是我們的CPU並沒有換掉,它應該可以識別同樣的指令呀!!! 如果你和我有同樣的疑問,那這一節,我們 ...
  • 一、相關文檔老規矩,為了避免我的解釋誤導大家,請大家務必通過官網瞭解一波SQL SERVER的相關功能。文檔地址:整體介紹文檔:https://docs.microsoft.com/en-us/sql/relational-databases/track-changes/about-change-t... ...
  • 用Google搜異常信息,肯定都訪問過 "Stack Overflow網站" 全球最大的程式員問答網站,名字來自於一個常見的報錯,就是棧溢出(stack overflow) 從函數調用開始,在電腦指令層面函數間的相互調用是怎麼實現的,以及什麼情況下會發生棧溢出 1 棧的意義 先看一個簡單的C程式 ...
  • 1、關閉防火牆 systemctl stop firewalld.service 停止firewall systemctl disable firewalld.service 禁止firewall開機啟動 2、切換用戶 3、編輯靜默安裝文件 4、修改配置文件 以下參數不要更改 [GENERAL] R ...
  • 相信大家都接觸過Mysql資料庫,而且也肯定都會寫sql。我不知道大家有沒有這樣的感受,反正我是有過這樣的想法。就是當我把一條sql語句寫完了,並且執行完得到想要的結果。這時我就在想為什麼我寫這樣的一條sql語句,就能給我查詢出我想要的結果,為什麼我寫了update就能更新一條語句?它們的執行過程是 ...
  • 1.首先安裝scala(找到合適版本的具體地址下載) 在/usr/local/目錄下 wget https://www.scala-lang.org/download/**** 2.安裝spark (由於我的Hadoop是2.7.6版本的,因此我所用的spark是在官網上的適用hadoop-2以上版 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...