Elasticsearch 搜索模板(Search Templates)把“可配置查詢”裝進 Mustache

1. 什么是 Search Template?能解決什么問題?

搜索模板是存儲在 ES 集群里的 Mustache 模板(lang: mustache)。你把一份標準 _search 請求體寫成模板,變量交給 params,每次調用只需傳參即可:

  • 搜索前端:把輸入框內容作為 params 傳進來,屏蔽 DSL 細節與危險語法。
  • 業務后端:把“檢索策略”與“業務代碼”解耦——需要改查詢邏輯時,只改模板,不用發版。
  • 多團隊協作:數據/搜索工程師直接維護模板,應用側只負責傳參和渲染結果。

模板以腳本的形式存在集群狀態中(Stored Script),受腳本開關與限制影響(如禁用腳本、限制大小等)。

2. 快速上手(5 分鐘)

2.1 創建/更新模板

PUT _scripts/my-search-template
{"script": {"lang": "mustache","source": {"query": { "match": { "message": "{{query_string}}" } },"from": "{{from}}","size": "{{size}}"}}
}

2.2 本地渲染與調試(不真正搜索)

POST _render/template
{"id": "my-search-template","params": { "query_string": "hello world", "from": 20, "size": 10 }
}

2.3 運行模板化搜索

GET my-index/_search/template
{"id": "my-search-template","params": { "query_string": "hello world", "from": 0, "size": 10 }
}

2.4 批量運行(多查詢一起發)

GET my-index/_msearch/template
{ }
{ "id": "my-search-template", "params": { "query_string": "hello world", "from": 0, "size": 10 } }
{ }
{ "id": "my-other-search-template", "params": { "query_type": "match_all" } }

2.5 管理模板

  • 獲取某個模板:GET _scripts/my-search-template
  • 列出全部:GET _cluster/state/metadata?filter_path=metadata.stored_scripts
  • 刪除:DELETE _scripts/my-search-template

3. Mustache 語法要點(結合搜索的“剛需功能”)

Mustache 是邏輯少的模板語言,靠變量替換 + 區塊控制完成拼裝。

3.1 變量與默認值

POST _render/template
{"source": {"query": { "match": { "message": "{{query_string}}" } },"from": "{{from}}{{^from}}0{{/from}}","size": "{{size}}{{^size}}10{{/size}}"},"params": { "query_string": "hello world" }
}
  • {{var}}:變量
  • {{^var}}default{{/var}}:當 var 不存在/為空時用默認值

3.2 條件與 if-else

"filter": [{{#year_scope}}{ "range": { "@timestamp": { "gte": "now-1y/d", "lt": "now/d" } }},{{/year_scope}}{ "term": { "user.id": "{{user_id}}" } }
]
  • {{#cond}}...{{/cond}}:cond 為真則渲染
  • {{^cond}}...{{/cond}}:cond 為假則渲染
  • 兩者可組合做 if-else

3.3 工具函數(Lambda)

  • URL 編碼{{#url}}{{host}}/{{page}}{{/url}}
  • 拼接數組{{#join delimiter='||'}}date.formats{{/join}}
  • 轉 JSON{{#toJson}}tags{{/toJson}}(數組/對象都能轉)

?? 強烈建議:凡是數組、對象、子查詢塊,一律用 toJson 輸出,避免引號/逗號導致的無效 JSON

3.4 列表循環與“尾逗號”陷阱

"fields": [{{#text_fields}}{{user_name}}{{^last}},{{/last}}{{/text_fields}}]
  • 用一個布爾字段 last 控制是否加逗號,避免 [a,b,] 這種無效 JSON。

3.5 更換變量分隔符(小眾)

{{=( )=}}
"message": "(query_string)"
(={{ }}=)

在模板內部臨時把 {{ }} 改為 (),適用于與其他模板語言沖突的場景。

不支持:Mustache 的 partials 特性在 ES 搜索模板里不可用。

4. 進階:把“復雜檢索策略”模板化

Search Template 的 source 支持 _search 的全部請求體,你可以模板化任何結構:Query DSL、Retrievers、kNN、RRF、LTR 重排、Async Search 參數等。

4.1 混合檢索(RRF)模板

PUT _scripts/rrf-template
{"script": {"lang": "mustache","source": {"retriever": {"rrf": {"rank_window_size": "{{rank_window}}{{^rank_window}}100{{/rank_window}}","retrievers": [{ "standard": { "query": { "match": { "text": "{{q}}" } } } },{ "standard": { "query": { "sparse_vector": {"field": "vector.tokens", "inference_id": "{{elser_id}}", "query": "{{q}}"}}}}]}},"size": "{{size}}{{^size}}10{{/size}}"}}
}

使用:

GET my-index/_search/template
{"id": "rrf-template","params": { "q": "blue shoes sale", "elser_id": "my-elser-endpoint", "size": 20 }
}

4.2 LTR(學習排序)重排模板

PUT _scripts/ltr-rescore
{"script": {"lang": "mustache","source": {"retriever": {"rescorer": {"retriever": { "standard": { "query": { "multi_match": {"query": "{{q}}", "fields": ["title^2","content"]}}}},"window_size": "{{win}}{{^win}}100{{/win}}","learning_to_rank": {"model_id": "{{model_id}}","params": { "query_text": "{{q}}" }}}},"from": "{{from}}{{^from}}0{{/from}}","size": "{{size}}{{^size}}10{{/size}}"}}
}

生產要點:window_size from + size,否則可能出現未重排的文檔排在前面。

4.3 可選項與權限控制

  • 把“是否限定時間范圍”“是否加高權重字段”等開關做成布爾參數,套 {{#cond}}...{{/cond}}
  • 把“敏感過濾”寫入模板,前端只能傳白名單參數,降低注入風險

5. 工程化落地清單

  1. 命名與版本
  • 模板 id 采用 search.<domain>.<scenario>.v1,修改不兼容時遞增版本,便于回滾。
  1. 參數白名單
  • 應用層只接受你定義好的 params 字段;對字符串做長度限制、對數組做最大項數限制
  1. 渲染前自檢
  • _render/template;若 JSON 解析失敗立即中斷,返回明確錯誤給上游。
  1. 監控與審計
  • 記錄模板 id、參數快照(脫敏)、渲染耗時、命中率、took、超時率,為回歸與 A/B 提供數據。
  1. 性能開關
  • 大范圍查詢配 timeout;只要命中數就 size:0 + terminate_after;
  • 不追求精確總數就別 track_total_hits:true(或給個閾值),保性能可控。
  1. 安全與腳本限制
  • 了解腳本相關設置(如禁用腳本會影響模板);控制模板大小與數量,避免集群狀態膨脹。

6. 常見坑與排雷

  • 尾逗號/引號錯位:數組/對象拼裝一律用 toJson;列表循環用 last 變量收尾。
  • 空變量導致非法查詢:對可空字段加默認值或用條件包裹。
  • 把用戶輸入直塞進 DSL:一定做白名單與長度校驗(模板只是替換,不會自動防注入)。
  • 腳本被禁用:排查集群腳本設置(模板屬于 stored script)。
  • 多團隊改動互相影響:對模板加 代碼評審/發布流程,并約定 id 與版本策略。

7. 一鍵遷移套路(給你一套模版骨架)

PUT _scripts/search.web.v1
{"script": {"lang": "mustache","source": {"query": {"bool": {"filter": [{{#time_range}}{ "range": { "@timestamp": { "gte": "{{gte}}", "lte": "{{lte}}" } } },{{/time_range}}{{#env}}{ "term": { "service.env": "{{env}}" } },{{/env}}{{#category}}{ "term": { "category.keyword": "{{category}}" } }{{/category}}],"must": [{{#q}}{ "simple_query_string": { "query": "{{q}}", "fields": ["title^2","content"] } }{{/q}}]}},"_source": ["@timestamp","title","url","snippet"],"from": "{{from}}{{^from}}0{{/from}}","size": "{{size}}{{^size}}10{{/size}}","timeout": "{{timeout}}{{^timeout}}2s{{/timeout}}"}}
}

8. 小結

  • Search Template = “可配置的搜索策略”:把 DSL/檢索管線參數化,統一在 ES 側托管。
  • Mustache 提供拼裝能力:默認值、條件、列表、URL 編碼、toJson 一應俱全。
  • 與新特性無縫結合:Retrievers / RRF / LTR / 語義重排 都能以模板方式下發。
  • 工程實踐很關鍵:參數白名單、渲染自檢、監控審計、版本與回滾,要一步到位。

如果你貼上真實索引 mapping期望的檢索策略(詞法/語義/融合/重排),我可以幫你把它們整理成一套模板庫(含渲染/校驗腳本與 Kibana 演示面板),直接接入生產。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/92695.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/92695.shtml
英文地址,請注明出處:http://en.pswp.cn/web/92695.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

cocos Uncaught TypeError: Cannot read properties of null (reading ‘SetActive‘)

報錯&#xff1a;Uncaught TypeError: Cannot read properties of null (reading SetActive) at b2RigidBody2D.setActive (rigid-body.ts:231:21) at b2RigidBody2D.onEnable (rigid-body.ts:78:14) at RigidBody2D.onEnable (rigid-body-2d.ts:551:24) at OneOffInvoker.invo…

Docker用戶組介紹以及管理策略

在Docker環境中&#xff0c;用戶組&#xff08;尤其是默認的docker組&#xff09;是管理用戶與Docker守護進程交互權限的核心機制。以下從概念介紹和具體管理操作兩方面詳細說明&#xff1a;一、Docker用戶組的核心概念 Docker守護進程&#xff08;dockerd&#xff09;默認通過…

【PyTorch】單目標檢測項目部署

【PyTorch】單目標檢測項目 兩種部署情況&#xff1a;部署在 PyTorch 數據集上&#xff0c;以及部署在本地存儲的單個映像上。 目錄 定義數據集 搭建模型 部署模型 定義數據集 詳細參照前文【PyTorch】單目標檢測項目 import torchvision import os import pandas as pd i…

Baumer高防護相機如何通過YoloV8深度學習模型實現火星隕石坑的檢測識別(C#代碼UI界面版)

《------往期經典推薦------》 AI應用軟件開發實戰專欄【鏈接】 序號 項目名稱 項目名稱 1 1.工業相機 + YOLOv8 實現人物檢測識別:(C#代碼,UI界面版) 2.工業相機 + YOLOv8 實現PCB的缺陷檢測:(C#代碼,UI界面版) 2 3.工業相機 + YOLOv8 實現動物分類識別:(C#代碼,U…

UniApp Vue3 TypeScript項目中使用xgplayer播放m3u8視頻的顯示問題

問題背景 在UniApp Vue3 TypeScript項目中使用xgplayer播放m3u8視頻時&#xff0c;遇到了一個棘手的問題&#xff1a;視頻畫面下移&#xff0c;只能聽到聲音&#xff0c;全屏后才能正常顯示。經過排查&#xff0c;發現是<video>元素在DOM渲染時被異常定位&#xff0c;導…

服務器硬件電路設計之 I2C 問答(三):I2C 總線上可以接多少個設備?如何保證數據的準確性?

在服務器硬件電路設計中&#xff0c;I2C 總線作為常用的串行通信協議&#xff0c;其設備連接數量和數據準確性至關重要。?I2C 總線上可連接的設備數量并非無限制。從理論上講&#xff0c;標準 I2C 設備采用 7 位地址&#xff0c;除去保留地址&#xff0c;最多可連接 112 個設備…

用LaTeX優化FPGA開發:結合符號計算與Vivado工具鏈

用 LaTeX 優化 FPGA 開發&#xff1a;結合符號計算與 Vivado 工具鏈&#xff08;一&#xff09; 系列文章目錄 第一章&#xff1a;深入了解 LaTeX&#xff1a;科技文檔排版的利器 第二章&#xff1a;LaTeX 下載安裝保姆級教程 第三章&#xff1a;LaTeX 創建工程并生成完整文檔…

人工智能系列(6)如何開發有監督神經網絡系統?

一. 開發有監督神經網絡系統的步驟1. 數據收集訓練數據通常由輸入–輸出成對組成&#xff0c;根據任務需求可能涵蓋不同情境&#xff08;如白天或夜晚的車輛識別&#xff09;&#xff0c;其類型可以是數值、圖像、音頻等多種形式&#xff1b;數據規模越大、越多樣&#xff0c;模…

CSS 選擇器進階:用更聰明的方式定位元素

在前端開發中&#xff0c;CSS 選擇器是我們與 DOM 對話的語言。雖然 class 和 id 是我們最熟悉的工具&#xff0c;但真正高效、優雅的樣式代碼&#xff0c;往往來自于對現代 CSS 選擇器的深入理解與巧妙運用。本文將帶你跳出基礎語法&#xff0c;探索那些能顯著提升開發效率和代…

常用排序方法

一、排序的概念及引用1、排序的概念排序&#xff1a;所謂排序&#xff0c;就是使一串記錄&#xff0c;按照其中的某個或某些關鍵字的大小&#xff0c;遞增或遞減的排列起來的操作。穩定性&#xff1a;假定在待排序的記錄序列中&#xff0c;存在多個具有相同的關鍵字的記錄&…

接口返回504 Gateway Time-out 錯誤,這意味著請求在網關或代理服務器等待上游服務器響應時超時。以下是可能的原因和排查建議:

問題分析1.后端處理耗時過長是某個方法執行時間過長&#xff0c;超過了網關的超時設置&#xff08;通常是幾十秒&#xff09;可能涉及大量數據查詢或復雜計算2.數據庫查詢性能問題查詢的數據量過大缺少必要的數據庫索引SQL語句執行效率低下排查建議1.檢查服務端日志查看應用日志…

DBAPI 實現不同角色控制查看表的不同列

DBAPI 實現不同角色控制查看表的不同列 場景說明 在數據庫管理系統中&#xff0c;對表進行列級別的權限控制是一項關鍵的安全措施&#xff0c;特別是在處理敏感數據或需要遵守特定數據訪問控制策略的情況下。合理的列權限控制不僅能保護敏感信息&#xff0c;還能幫助組織滿足合…

二維圖像處理(完整版)

目錄 1.變換矩陣 2.在矩陣的基礎上添加各種變換形式 3.開始變換 4.計算變換矩陣參數 新算子 二、閾值分割 新算子 三、blob分析案例 1.焊點 2.石頭 3.木材 4.車牌 5.骰子 新算子 四、傅里葉變換頻域分析 問題一 五、濾波處理 1.均值濾波 2.中值濾波 3.高斯…

計算機網絡:求地址塊128.14.35.7/20中的相關信息

128.14.35.7/20是某一地址塊&#xff0c;求該地址塊中的網絡地址&#xff0c;IP地址最大值&#xff0c;最小值&#xff0c;地址數 這里的最大值&#xff1a;廣播地址&#xff0c;最小值&#xff1a;網絡地址&#xff0c;地址數&#xff1a;可分配主機數 最關鍵的一步就點分十進…

3深度學習Pytorch-神經網絡--全連接神經網絡、數據準備(構建數據類Dataset、TensorDataset 和數據加載器DataLoader)

文章目錄一、深度學習概述二、神經網絡基礎人工神經網絡&#xff08;ANN&#xff09;基本結構神經網絡的構建全連接神經網絡&#xff08;FCN&#xff09;計算步驟基本組件1. 線性層組件2. 激活函數&#xff08;Activation Function&#xff09;3. 損失函數&#xff08;Loss Fun…

MyEclipse啟動OutOfMemoryError內存溢出

java.lang.OutOfMemoryError&#xff1a;Java heap space打開setting&#xff0c;搜索heap&#xff0c;compiler heap sizejava.lang.OutOfMemoryError&#xff1a;insufficient memory①點擊file&#xff0c;選擇Invalidate Caches ②點擊file->Build,Excetion,Deployment-…

java畢業設計實例-基于springboot的校園資訊分享平臺的設計與實現(源碼+LW+部署文檔+全bao+遠程調試+代碼講解等)

博主介紹&#xff1a;??碼農一枚 &#xff0c;專注于大學生項目實戰開發、講解和畢業&#x1f6a2;文撰寫修改等。全棧領域優質創作者&#xff0c;博客之星、掘金/華為云/阿里云/InfoQ等平臺優質作者、專注于Java、小程序技術領域和畢業項目實戰 ??技術范圍&#xff1a;&am…

手寫 Spring

01 - 原始版本的 IOC 容器 IOC 容器的作用是自動創建對象&#xff0c;降低系統間的耦合度 core public interface Resource extends Iterator<Object>{ }外部的配置信息都當成 Resource (資源)來進行抽象 public class ClassPathXmlResource implements Resource {Docume…

【物聯網】基于樹莓派的物聯網開發【24】——樹莓派安裝influxDB時序數據庫

使用背景 聚焦大數據底層技術軟件研發&#xff0c;實現時序數據采集、寫入、存儲、查詢、分析 場景介紹 用于存儲和分析時間序列數據的開源數據庫 安裝 InfluxDB 添加 InfluxDB 的倉庫&#xff1a; wget -qO- https://repos.influxdata.com/influxdb.key | sudo apt-key add - …

Python 程序設計講義(68):Python 的文件操作——使用os模塊操作文件

Python 程序設計講義&#xff08;68&#xff09;&#xff1a;Python 的文件操作——使用os模塊操作文件 目錄Python 程序設計講義&#xff08;68&#xff09;&#xff1a;Python 的文件操作——使用os模塊操作文件一、刪除文件&#xff1a;使用os.remove()函數二、重命名文件與…