Elasticsearch实战Java中使用Search Template搜索模板完整教程流程图代码可直接运行一、前言二、核心基础Java 使用 Search Template 核心概念1. 定义Java 中使用 Search Template2. 核心依赖3. 核心价值三、Java 使用 Search Template 完整流程图四、环境准备五、第一步Maven 依赖引入核心六、第二步初始化 RestHighLevelClient 客户端七、第三步提前在 Kibana 存储搜索模板八、第四步Java 实现 Search Template 4 种核心用法生产代码用法1Java 执行服务端存储的搜索模板最常用用法2Java 预览搜索模板调试专用用法3Java 内嵌模板不存储在ES直接写在Java中用法4Java 删除服务端模板九、第五步Java 解析 Search Template 返回结果十、Java 使用 Search Template 完整调用示例十一、生产环境最佳实践十二、常见问题与解决方案1. 问题Java 提示模板不存在2. 问题参数传递不生效3. 问题版本冲突报错4. 问题查询无数据十三、总结总结The Begin点点关注收藏不迷路一、前言在上一篇文章中我们讲解了 Elasticsearch Search Template搜索模板的核心概念与DSL用法。在实际企业开发中90%的场景都是使用 Java 客户端调用搜索模板实现查询逻辑与业务代码解耦。本文专门聚焦Java 语言如何使用 Search Template包含完整流程图、依赖引入、模板存储、4种Java实战用法执行/预览/内嵌/删除、生产级代码封装、常见问题从零到一实现 Java 对接 ES 搜索模板代码可直接复制到项目中运行。二、核心基础Java 使用 Search Template 核心概念1. 定义Java 中使用 Search Template通过Elasticsearch RestHighLevelClient高级客户端调用服务端存储的搜索模板仅传递动态参数由 ES 完成 DSL 拼接与查询执行实现 Java 代码无硬编码 DSL。2. 核心依赖必须使用elasticsearch-rest-high-level-client7.x/8.x通用3. 核心价值Java 代码无任何DSL字符串整洁易维护修改查询逻辑无需修改Java代码、无需发版统一查询规范多系统复用模板支持动态参数、默认值、条件判断三、Java 使用 Search Template 完整流程图引入Java高级客户端依赖创建ES连接客户端在Kibana/Java存储搜索模板Java业务代码构建动态参数调用SearchTemplate APIES参数填充模板生成DSL执行查询并返回结果给Java解析结果并返回前端四、环境准备SpringBoot 2.x/3.xElasticsearch 7.17通用7.x版本RestHighLevelClient 客户端已创建索引product商品索引已存储模板product_search_template五、第一步Maven 依赖引入核心在pom.xml中引入 ES 高级客户端依赖!-- Elasticsearch Rest 高级客户端 --dependencygroupIdorg.elasticsearch.client/groupIdartifactIdelasticsearch-rest-high-level-client/artifactIdversion7.17.0/version/dependency!-- ES 核心包 --dependencygroupIdorg.elasticsearch/groupIdartifactIdelasticsearch/artifactIdversion7.17.0/version/dependency六、第二步初始化 RestHighLevelClient 客户端创建 ES 连接配置类注入 Beanimportorg.elasticsearch.client.RestClient;importorg.elasticsearch.client.RestHighLevelClient;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;ConfigurationpublicclassEsConfig{BeanpublicRestHighLevelClientrestHighLevelClient(){returnnewRestHighLevelClient(RestClient.builder(// ES 地址多个用逗号分隔newHttpHost(127.0.0.1,9200,http)));}}七、第三步提前在 Kibana 存储搜索模板执行 DSL创建 Java 要调用的模板PUT/_scripts/product_search_template{script:{lang:mustache,source:{from:{{from}}{{^from}}0{{/from}},size:{{size}}{{^size}}10{{/size}},query:{bool:{must:[{match:{name:{{keyword}}}}],filter:[{term:{category:{{category}}}}]}},sort:[{price:asc}]}}}八、第四步Java 实现 Search Template 4 种核心用法生产代码用法1Java 执行服务端存储的搜索模板最常用直接调用 ES 中已存储的模板传递参数执行查询企业生产首选。importorg.elasticsearch.action.search.SearchResponse;importorg.elasticsearch.client.RequestOptions;importorg.elasticsearch.client.RestHighLevelClient;importorg.elasticsearch.script.ScriptType;importorg.elasticsearch.script.mustache.SearchTemplateRequest;importorg.elasticsearch.script.mustache.SearchTemplateResponse;importorg.springframework.stereotype.Service;importjavax.annotation.Resource;importjava.util.HashMap;importjava.util.Map;ServicepublicclassEsSearchTemplateService{// 注入ES客户端ResourceprivateRestHighLevelClientclient;/** * 1. Java 执行服务端存储的 Search Template生产最常用 * param keyword 搜索关键词 * param category 商品分类 * param pageNum 页码 * param pageSize 每页条数 * return 搜索结果 */publicSearchResponsesearchTemplate(Stringkeyword,Stringcategory,intpageNum,intpageSize)throwsException{// 1. 构建搜索模板请求SearchTemplateRequestrequestnewSearchTemplateRequest();// 指定要查询的索引request.setRequest(neworg.elasticsearch.action.search.SearchRequest(product));// 2. 核心配置使用服务端存储的模板request.setScriptType(ScriptType.STORED);// 存储型模板request.setScript(product_search_template);// 模板ID// 3. 封装动态参数MapString,ObjectparamsnewHashMap();params.put(from,(pageNum-1)*pageSize);params.put(size,pageSize);params.put(keyword,keyword);params.put(category,category);request.setParams(params);// 4. 执行模板查询SearchTemplateResponseresponseclient.searchTemplate(request,RequestOptions.DEFAULT);// 5. 返回查询结果returnresponse.getResponse();}}用法2Java 预览搜索模板调试专用不执行查询只返回拼接后的最终DSL用于开发调试。/** * 2. Java 预览搜索模板调试查看最终DSL */publicStringrenderTemplate(Stringkeyword,Stringcategory)throwsException{SearchTemplateRequestrequestnewSearchTemplateRequest();request.setRequest(neworg.elasticsearch.action.search.SearchRequest(product));// 模板配置request.setScriptType(ScriptType.STORED);request.setScript(product_search_template);// 参数MapString,ObjectparamsnewHashMap();params.put(from,0);params.put(size,10);params.put(keyword,keyword);params.put(category,category);request.setParams(params);// 开启预览模式不执行查询request.setSimulate(true);// 执行预览SearchTemplateResponseresponseclient.searchTemplate(request,RequestOptions.DEFAULT);returnresponse.getSource().toString();}用法3Java 内嵌模板不存储在ES直接写在Java中模板不存储在ES直接在Java代码中定义适合临时简单查询。/** * 3. Java 内嵌 Search Template不存ES直接写代码里 */publicSearchResponseinlineTemplate(Stringkeyword)throwsException{SearchTemplateRequestrequestnewSearchTemplateRequest();request.setRequest(neworg.elasticsearch.action.search.SearchRequest(product));// 内嵌模板request.setScriptType(ScriptType.INLINE);request.setScript({\n \query\: { \match\: { \name\: \{{keyword}}\ } }\n});// 参数MapString,ObjectparamsnewHashMap();params.put(keyword,keyword);request.setParams(params);// 执行SearchTemplateResponseresponseclient.searchTemplate(request,RequestOptions.DEFAULT);returnresponse.getResponse();}用法4Java 删除服务端模板通过 Java 代码删除 ES 中存储的模板。/** * 4. Java 删除搜索模板 * param templateId 模板ID */publicvoiddeleteTemplate(StringtemplateId)throwsException{DeleteStoredScriptRequestrequestnewDeleteStoredScriptRequest(templateId);client.deleteScript(request,RequestOptions.DEFAULT);}九、第五步Java 解析 Search Template 返回结果执行模板后解析查询到的文档数据/** * 解析模板查询结果 */publicListMapString,ObjectparseResponse(SearchResponseresponse){ListMapString,ObjectresultListnewArrayList();SearchHitshitsresponse.getHits();for(SearchHithit:hits){// 文档数据MapString,Objectsourcehit.getSourceAsMap();// 文档IDStringidhit.getId();source.put(id,id);resultList.add(source);}returnresultList;}十、Java 使用 Search Template 完整调用示例// 调用查询 图书分类、关键词实战、第1页、每页2条SearchResponseresponseesSearchTemplateService.searchTemplate(实战,图书,1,2);// 解析结果ListMapString,ObjectresultesSearchTemplateService.parseResponse(response);十一、生产环境最佳实践优先使用服务端存储模板ScriptType.STORED查询逻辑存在ESJava 无硬编码修改查询无需重启Java服务统一模板ID命名规范格式业务_模块_功能product_search_template调试必须用预览simulatetrue上线前校验最终DSL是否正确参数非空校验防止模板渲染报错模板必须设置默认值from/size默认值避免参数为空十二、常见问题与解决方案1. 问题Java 提示模板不存在✅ 解决方案检查模板ID是否一致确认模板已存储到ES2. 问题参数传递不生效✅ 解决方案检查参数名与模板{{}}变量名完全一致3. 问题版本冲突报错✅ 解决方案保证 ES 服务端版本与 Java 客户端版本一致4. 问题查询无数据✅ 解决方案使用预览功能查看最终DSL是否正确十三、总结Java 中使用 Elasticsearch Search Template 非常简单核心就是 3 步模板提前存储在 ESJava 构建参数通过SearchTemplateRequest调用执行并解析返回结果核心APISearchTemplateRequest搜索模板请求ScriptType.STORED服务端存储模板setParams()传递动态参数client.searchTemplate()执行模板查询本文提供的代码可直接复制到 SpringBoot 项目中运行完美实现 Java 对接 Search Template解决查询硬编码、难以维护的企业级痛点。总结Java 使用 Search Template 核心依赖RestHighLevelClient生产优先使用服务端存储模板 Java传参核心APISearchTemplateRequestScriptType.STORED优势无硬编码、热更新、易维护、多端复用The End点点关注收藏不迷路