news 2026/6/15 1:14:54

ElasticsearchRestTemplate使用方法详解!!!

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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("华为");
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 0:57:20

如何3分钟免费解锁Cursor Pro:终极AI编程助手破解方案

如何3分钟免费解锁Cursor Pro&#xff1a;终极AI编程助手破解方案 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reached your tri…

作者头像 李华
网站建设 2026/6/15 0:49:08

MPC8306 PowerQUICC II Pro:通信处理器架构与QUICC Engine实战解析

1. MPC8306 PowerQUICC II Pro&#xff1a;嵌入式通信系统的“瑞士军刀”在工业控制、网络接入设备、通信网关这些对实时性和多协议处理能力要求严苛的领域&#xff0c;选对一颗“心脏”至关重要。这颗心脏不仅要算得快&#xff0c;还得是个“多面手”&#xff0c;能同时流畅地…

作者头像 李华
网站建设 2026/6/15 0:27:14

如何让Figma说中文:设计师亲测的完整汉化解决方案

如何让Figma说中文&#xff1a;设计师亲测的完整汉化解决方案 【免费下载链接】figmaCN 中文 Figma 插件&#xff0c;设计师人工翻译校验 项目地址: https://gitcode.com/gh_mirrors/fi/figmaCN 你是否曾因Figma的全英文界面而感到困扰&#xff1f;当团队协作时&#xf…

作者头像 李华
网站建设 2026/6/15 0:23:15

GSV5800@ACP#Serdes 高速延长芯片,物理 AI 分布式显示的传输骨干

在悟道 4.0 物理 AI 驱动的大型分布式终端中&#xff0c;如 AI 机房集中监控系统、工业级物理仿真平台&#xff0c;算力主机与显示终端往往距离较远&#xff0c;普通视频线材无法满足长距离、高带宽、低延迟的传输需求。GSV5800 作为基石酷联推出的高性能 Serdes 扩展芯片&…

作者头像 李华