当前位置: 首页 > 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.rkmt.cn/news/1527094.html

相关文章:

  • 山东大学软件学院创新实训 个人博客(六)健康提醒系统的完整开发与优化
  • 2026 温州管道疏通与异味治理机构精选 5 家 马桶 / 厨卫下水 / 地漏除臭服务参考 - 宅安选房屋修缮
  • ISP Tuning新手到高手:我的三段式学习心法与实战避坑指南
  • 广州佛山团建拓展优质企业
  • 复试逆袭指南:郑大网安院学长亲授,如何用一周时间搞定笔试、机试和面试
  • 如何将SillyTavern打造成你的专属AI聊天桌面应用?5分钟快速配置指南
  • 华为海思软开岗面经:三轮面试官都问了啥?我的项目经历被挖了个底朝天
  • 2026年新消息:温州法兰定做厂家可靠选择指南 - 品牌鉴赏官2026
  • 2026年成都家具定制行业观察:中古风与美式实木的落地选择指南 - 优质品牌商家
  • 数据治理对企业来说重要吗 2026智能体时代企业数字基座全解析
  • 山东大学软件学院创新实训 个人博客(6)
  • 2026 济南管道疏通与异味治理机构精选 5 家 马桶 / 厨卫下水 / 地漏除臭服务参考 - 宅安选房屋修缮
  • 小码有客:专注一物一码红包营销的零代码 SaaS 平台
  • ArcGIS Pro 基础:符号系统的使用(比例符号/分级色彩)
  • Day46
  • 2026年当下,如何甄选武汉地区性价比高的高分子护栏供应商?这份指南请收好 - 品牌鉴赏官2026
  • 别再问FAB厂转IC难不难了!手把手教你评估自身条件与制定学习路线(数字验证/版图方向)
  • Java 程序设计基础(第5章第7节)| Lambda表达式
  • 海南商标专利申请代办机构推荐 2026 正规资质 商标专利申请流程及费用 海南知识产权代理公司口碑排名 海南商标专利代理业务专业机构 TOP4 - 资讯速览
  • 杭州附近靠谱防水补漏公司 专业漏水维修漏水检测 屋面外墙卫生间阳光房水管地下室电梯井彩钢瓦防水隔热 - 资讯速览
  • 2026年鄂州黄金上门回收市场深度观察:谁在为本地变现“兜底”? - 优质品牌商家
  • 终极SillyTavern角色卡片实战指南:从零打造生动AI伙伴的完整教程
  • ​LabVIEW 与 OPC UA 方法调用:现状、局限与替代方案
  • 奇安信安服实习生面试复盘:从渗透思路到Nmap参数,我是如何回答这些高频问题的
  • 宁德霞浦接地气海鲜大排档推荐:分清两家门店,优选新美味园旗舰店 - 资讯速览
  • 2026 郑州管道疏通与异味治理机构精选 5 家 马桶 / 厨卫下水 / 地漏除臭服务参考 - 宅安选房屋修缮
  • 终极免费分屏方案:Nucleus Co-Op 让单机游戏变身多人派对
  • 别再死记硬背口诀了!用Arduino和ESP32实战PID调参,手把手带你调出稳定小车
  • 神经符号AI的鲁棒性:让AI更“抗造”、更“讲理”的融合之道
  • 如何快速恢复丢失的Ren‘Py游戏脚本:Unrpyc终极指南