当前位置: 首页 > news >正文

ElasticsearchRestTemplate使用方法详解!!!

本文基于 SpringBoot 3 + ES High Level Rest Client,详细介绍精确匹配、模糊检索、布尔多条件、范围、排序分页、聚合、高亮、批量操作的使用。

前置实体

1)商品文档实体 GoodsDoc

importlombok.Data;importorg.springframework.data.annotation.Id;importorg.springframework.data.elasticsearch.annotations.Document;importorg.springframework.data.elasticsearch.annotations.Field;importorg.springframework.data.elasticsearch.annotations.FieldType;@Data@Document(indexName="goods")publicclassGoodsDoc{@IdprivateStringid;@Field(type=FieldType.Text,analyzer="ik_max_word")privateStringtitle;@Field(type=FieldType.Keyword)privateStringcategory;@Field(type=FieldType.Double)privateDoubleprice;@Field(type=FieldType.Integer)privateIntegerstock;}

2)注入模板对象

importorg.springframework.data.elasticsearch.client.elc.ElasticsearchRestTemplate;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Service;@ServicepublicclassEsSearchService{@AutowiredprivateElasticsearchRestTemplaterestTemplate;}

term 精确查询(keyword)

DSL

GET/goods/_search{"query":{"term":{"category":{"value":"手机"}}}}

Java 代码

importco.elastic.clients.elasticsearch.core.SearchResponse;importco.elastic.clients.elasticsearch.core.search.Hit;importjava.util.List;publicList<GoodsDoc>searchByCategory(StringcategoryVal){NativeSearchQueryBuilderbuilder=newNativeSearchQueryBuilder();builder.withQuery(QueryBuilders.termQuery("category",categoryVal));SearchHits<GoodsDoc>hits=restTemplate.search(builder.build(),GoodsDoc.class);returnhits.stream().map(h->h.getContent()).toList();}

match 全文分词检索(text)

DSL

GET/goods/_search{"query":{"match":{"title":"华为手机"}}}

Java

publicList<GoodsDoc>searchByTitle(Stringkeyword){NativeSearchQueryBuilderbuilder=newNativeSearchQueryBuilder();builder.withQuery(QueryBuilders.matchQuery("title",keyword));SearchHits<GoodsDoc>hits=restTemplate.search(builder.build(),GoodsDoc.class);returnhits.stream().map(Hit::getContent).toList();}

bool 组合多条件(must + filter)

需求:标题含手机,价格 2000~6000,库存>0

GET/goods/_search{"query":{"bool":{"must":[{"match":{"title":"手机"}}],"filter":[{"range":{"price":{"gte":2000,"lte":6000}}},{"range":{"stock":{"gt":0}}}]}}}

Java

publicList<GoodsDoc>searchBoolCombination(StringtitleKey,doubleminPrice,doublemaxPrice){NativeSearchQueryBuilderbuilder=newNativeSearchQueryBuilder();BoolQueryBuilderbool=QueryBuilders.boolQuery().must(QueryBuilders.matchQuery("title",titleKey)).filter(QueryBuilders.rangeQuery("price").gte(minPrice).lte(maxPrice)).filter(QueryBuilders.rangeQuery("stock").gt(0));builder.withQuery(bool);SearchHits<GoodsDoc>hits=restTemplate.search(builder.build(),GoodsDoc.class);returnhits.stream().map(Hit::getContent).toList();}

分页 + 排序

GET/goods/_search{"from":0,"size":10,"sort":[{"price":"desc"}]}

Java

publicList<GoodsDoc>searchPageSort(intpageNum,intpageSize){NativeSearchQueryBuilderbuilder=newNativeSearchQueryBuilder();// 分页builder.withPageable(PageRequest.of(pageNum-1,pageSize));// 价格降序builder.withSort(SortBuilders.fieldSort("price").order(SortOrder.DESC));SearchHits<GoodsDoc>hits=restTemplate.search(builder.build(),GoodsDoc.class);returnhits.stream().map(Hit::getContent).toList();}

聚合统计(按分类分组,求均价、商品数量)

GET/goods/_search{"size":0,"aggs":{"group_category":{"terms":{"field":"category"},"aggs":{"avg_price":{"avg":{"field":"price"}}}}}}

Java 完整聚合代码

importco.elastic.clients.elasticsearch.core.SearchResponse;importco.elastic.clients.elasticsearch.core.aggregation.Aggregate;importco.elastic.clients.elasticsearch.core.aggregation.bucket.TermsAggregate;importco.elastic.clients.elasticsearch.core.aggregation.metrics.AvgAggregate;publicvoidaggCategoryStat(){NativeSearchQueryBuilderbuilder=newNativeSearchQueryBuilder();builder.withSize(0);// 不需要原始文档TermsAggregationBuildertermsAgg=AggregationBuilders.terms("group_category").field("category").subAggregation(AggregationBuilders.avg("avg_price").field("price"));builder.withAggregations(termsAgg);SearchResponse<GoodsDoc>resp=restTemplate.search(builder.build(),GoodsDoc.class);Aggregateagg=resp.aggregations().get("group_category");TermsAggregate<?>terms=agg.terms();for(varbucket:terms.buckets().array()){Stringcategory=bucket.keyAsString();longcount=bucket.docCount();AvgAggregateavgPriceAgg=bucket.aggregations().get("avg_price").avg();doubleavgPrice=avgPriceAgg.value();System.out.printf("分类:%s,商品数:%d,均价:%.2f%n",category,count,avgPrice);}}

关键词高亮

publicList<GoodsDoc>searchHighlight(Stringkeyword){NativeSearchQueryBuilderbuilder=newNativeSearchQueryBuilder();builder.withQuery(QueryBuilders.matchQuery("title",keyword));HighlightBuilderhighlight=newHighlightBuilder();highlight.field("title").preTags("<span style='color:red'>").postTags("</span>");builder.withHighlightBuilder(highlight);SearchHits<GoodsDoc>hits=restTemplate.search(builder.build(),GoodsDoc.class);List<GoodsDoc>result=newArrayList<>();for(SearchHit<GoodsDoc>hit:hits){GoodsDocdoc=hit.getContent();// 取出高亮片段List<String>highlightTitles=hit.getHighlightFields().get("title");if(highlightTitles!=null&&!highlightTitles.isEmpty()){doc.setTitle(highlightTitles.get(0));}result.add(doc);}returnresult;}

批量新增 / 批量更新

publicvoidbulkInsert(List<GoodsDoc>docList){NativeBulkQueryBuilderbulkBuilder=newNativeBulkQueryBuilder();for(GoodsDocdoc:docList){bulkBuilder.withOperation(BulkOperationBuilder.index(IndexQueryBuilder.withId(doc.getId()).withObject(doc)));}restTemplate.bulk(bulkBuilder.build(),GoodsDoc.class);}

关键说明

  1. NativeSearchQueryBuilder用来链式拼装 DSL,不用手写 JSON 字符串;
  2. termQuery只适用于keywordmatchQuery对应text分词检索;
  3. filter不会计算打分,性能优于must,过滤条件尽量放 filter;
  4. 聚合查询设置size(0),不返回原始文档,减少网络传输;
  5. 深分页不要无限from/size,改用searchAfter游标分页;

调用测试示例

// 精确查询esSearchService.searchByCategory("手机");// 多条件组合esSearchService.searchBoolCombination("华为",2000,6000);// 分页esSearchService.searchPageSort(1,10);// 聚合统计esSearchService.aggCategoryStat();// 高亮esSearchService.searchHighlight("华为");
http://www.jsqmd.com/news/1015275/

相关文章:

  • 硬件面试官最爱问的10个模电/数电问题(附手绘电路图避坑指南)
  • 如何快速安装Realtek 8192FU无线网卡驱动:Linux系统完整指南
  • 软考高项成本管理ITTO记不住?试试用这4个接地气的故事场景来搞定
  • 二战341分,从北京985调剂到安大:我的电子信息调剂邮件模板与简历打磨心得
  • 2026北京比较好的高分子温脱硝剂厂商排名 - 品牌排行榜
  • 从一张图看懂副热带高压:Python绘制588线揭示的2023年夏季天气密码
  • 2026 温州管道疏通与异味治理机构精选 5 家 马桶 / 厨卫下水 / 地漏除臭服务参考 - 宅安选房屋修缮
  • 山东大学软件学院创新实训 个人博客(六)健康提醒系统的完整开发与优化
  • 广州佛山团建拓展优质企业
  • Kamailio 深度技术解析:构建电信级 SIP 信令核心
  • 2026乐山律师事务所选择指南:靠谱律所怎么找?多主体实力解析与收费参考 - 优质品牌商家
  • OpenPLC Editor:开源工业控制编程环境的深度解析与实践指南
  • 2026年膜结构体育看台选购指南:6家主流企业深度分析与实景案例参考 - 优质品牌商家
  • 复试逆袭指南:郑大网安院学长亲授,如何用一周时间搞定笔试、机试和面试
  • ISP Tuning新手到高手:我的三段式学习心法与实战避坑指南
  • 如何用ComfyUI IPAdapter实现AI图像风格迁移:从安装到高级应用的完整指南
  • 想进能源央企?除了刷题,你还需要知道这些:中海油/中石化/中石油校招深度解析
  • 2026崂山区空调移机联系电话及服务选择参考 - 品牌排行榜
  • 避坑指南:给IEEE TII/TITS/IoTJ投稿前,你必须知道的5个潜规则与应对策略
  • 如何将SillyTavern打造成你的专属AI聊天桌面应用?5分钟快速配置指南
  • 廊坊黄金回收实时行情与商家对比指南 —— 靠谱推荐典典佳汇! - 诚鑫名品
  • 2026北京薪酬设计|薪酬体系|薪酬改革|薪酬绩效|薪酬激励咨询公司专项评测:从体系搭建到国企改革的实战标杆 - 互联网科技品牌测评
  • 2026年南京婚姻情感心理咨询机构选择指南 - 品牌排行榜
  • 2026年新消息:温州法兰定做厂家可靠选择指南 - 品牌鉴赏官2026
  • 从面试官视角拆解K8s:那些藏在Deployment、Service和Ingress背后的真实生产考量
  • 电脑防泄密软件哪家好?6款超实用的电脑防泄密软件推荐,功能详解
  • 华为海思软开岗面经:三轮面试官都问了啥?我的项目经历被挖了个底朝天
  • 【计算机毕业设计案例】基于 SpringBoot 的校园公告资讯共享系统的设计与实现(程序+文档+讲解+定制)
  • Ubuntu新手避坑:arm-linux-gcc命令找不到?可能是你装错了架构(附交叉编译工具链安装指南)
  • 外贸 AI 写作工具 API 评测:7 款工具翻译、开发信生成接口集成对比(2026)