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()函数二、重命名文件与…