Spring Data Elasticsearch实战复杂查询语法与高级检索全场景实现指南前言一、核心前置知识1.1 核心API复杂查询基础1.2 复杂查询核心流程1.3 环境依赖Maven1.4 实体类定义全文示例二、Spring Data Elasticsearch 十大复杂查询实战2.1 布尔查询Bool Query【最核心、最常用】2.2 范围查询Range Query2.3 模糊查询与精准匹配2.4 分页 排序查询生产必备2.5 高亮查询Highlight Query2.6 聚合查询Aggregation2.7 过滤查询Filter Query【性能最优】2.8 嵌套查询Nested Query2.9 多字段组合查询Multi Match2.10 自定义原生DSL查询三、复杂查询结果统一解析工具四、Spring Data Elasticsearch 复杂查询优化建议五、完整查询开发流程图六、总结The Begin点点关注收藏不迷路前言在Spring Boot整合Elasticsearch开发中Spring Data Elasticsearch简称SDES是官方推荐的ORM操作框架它屏蔽了原生API的复杂性提供了标准化的数据操作方式。但在实际生产中简单的CRUD远不能满足业务需求布尔查询、范围查询、模糊查询、聚合查询、分页排序、高亮显示等复杂查询才是核心。很多开发者对SDES的复杂查询API不熟悉只能被迫使用原生REST接口导致代码混乱、维护困难。本文基于Spring Data Elasticsearch 4.x适配ES 7.x/8.x从基础环境搭建到十大复杂查询场景实战搭配流程图、完整代码示例带你一站式掌握SDES复杂查询开发。一、核心前置知识1.1 核心API复杂查询基础ElasticsearchRestTemplateSDES核心模板类支持所有复杂查询NativeSearchQuery原生查询构建器支持任意ES DSL语法CriteriaQuery面向对象的条件查询Aggregation聚合查询工具HighlightBuilder高亮查询构建器1.2 复杂查询核心流程初始化ElasticsearchRestTemplate构建查询条件NativeSearchQuery配置查询类型布尔/范围/模糊/聚合等配置分页/排序/高亮/过滤执行template.search查询解析结果文档聚合高亮封装VO返回前端1.3 环境依赖Maven!-- Spring Data Elasticsearch --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-elasticsearch/artifactIdversion3.2.0/version/dependency1.4 实体类定义全文示例Document(indexNameproduct_index,createIndextrue)publicclassProduct{IdprivateLongid;Field(typeFieldType.Text,analyzerik_max_word)privateStringname;Field(typeFieldType.Keyword)privateStringcategory;Field(typeFieldType.Double)privateDoubleprice;Field(typeFieldType.Date)privateStringcreateTime;Field(typeFieldType.Text,analyzerik_max_word)privateStringdesc;// getter/setter}二、Spring Data Elasticsearch 十大复杂查询实战2.1 布尔查询Bool Query【最核心、最常用】布尔查询是复杂查询的基石支持must(and)、should(or)、mustNot(not)、filter四种条件组合。适用场景多条件组合检索、精准过滤代码示例// 需求名称包含手机 AND 分类电子产品 AND 价格不高于5000publicListProductboolQuery(){NativeSearchQueryquerynewNativeSearchQueryBuilder().withQuery(QueryBuilders.boolQuery().must(QueryBuilders.matchQuery(name,手机))// 必须匹配.filter(QueryBuilders.termQuery(category,电子产品))// 过滤无算分.mustNot(QueryBuilders.rangeQuery(price).gt(5000))// 不匹配).build();SearchHitsProductsearchHitstemplate.search(query,Product.class);returnsearchHits.stream().map(SearchHit::getContent).toList();}2.2 范围查询Range Query适用场景价格区间、时间区间、数值筛选代码示例// 价格 1000~3000创建时间近7天publicListProductrangeQuery(){NativeSearchQueryquerynewNativeSearchQueryBuilder().withQuery(QueryBuilders.rangeQuery(price).gte(1000).lte(3000)).withFilter(QueryBuilders.rangeQuery(createTime).gte(now-7d).lte(now))// 时间范围.build();SearchHitsProductsearchHitstemplate.search(query,Product.class);returnsearchHits.stream().map(SearchHit::getContent).toList();}2.3 模糊查询与精准匹配matchQuery分词模糊查询termQuery精准匹配keyword字段wildcardQuery通配符模糊查询matchPhraseQuery短语精确匹配代码示例// 名称模糊匹配分类精准匹配publicListProductmatchAndTerm(){NativeSearchQueryquerynewNativeSearchQueryBuilder().withQuery(QueryBuilders.matchQuery(name,华为手机))// 分词模糊.withFilter(QueryBuilders.termQuery(category,电脑))// 精准.build();// ...解析结果}2.4 分页 排序查询生产必备适用场景列表展示、大数据量分页代码示例publicListProductpageAndSort(intpage,intsize){NativeSearchQueryquerynewNativeSearchQueryBuilder().withQuery(QueryBuilders.matchAllQuery()).withPageable(PageRequest.of(page,size))// 分页.withSort(SortBuilders.fieldSort(price).order(SortOrder.DESC))// 排序.build();SearchHitsProductsearchHitstemplate.search(query,Product.class);returnsearchHits.stream().map(SearchHit::getContent).toList();}2.5 高亮查询Highlight Query适用场景搜索结果关键词标红、标黄代码示例publicListProducthighLightQuery(Stringkeyword){// 高亮配置HighlightBuilderhighlightBuildernewHighlightBuilder();highlightBuilder.field(name).preTags(span stylecolor:red).postTags(/span);NativeSearchQueryquerynewNativeSearchQueryBuilder().withQuery(QueryBuilders.matchQuery(name,keyword)).withHighlightBuilder(highlightBuilder).build();SearchHitsProductsearchHitstemplate.search(query,Product.class);// 解析高亮字段ListProductresultnewArrayList();for(SearchHitProducthit:searchHits){Productproducthit.getContent();StringhighLightNamehit.getHighlightFields().get(name).get(0);product.setName(highLightName);result.add(product);}returnresult;}2.6 聚合查询Aggregation适用场景统计、分组、求和、平均值、最大值、最小值代码示例按分类分组统计publicMapString,LongaggregationQuery(){NativeSearchQueryquerynewNativeSearchQueryBuilder().addAggregation(AggregationBuilders.terms(group_by_category).field(category)).withSourceFilter(newFetchSourceFilter(newString[]{},null))// 不返回文档.build();SearchHitsProductsearchHitstemplate.search(query,Product.class);TermstermssearchHits.getAggregations().get(group_by_category);MapString,LongmapnewHashMap();for(Terms.Bucketbucket:terms.getBuckets()){map.put(bucket.getKeyAsString(),bucket.getDocCount());}returnmap;}2.7 过滤查询Filter Query【性能最优】特点不计算相关性分数、自动缓存、性能极高适用场景状态、分类、时间等固定过滤条件.withQuery(QueryBuilders.boolQuery().filter(QueryBuilders.termQuery(status,1)).filter(QueryBuilders.rangeQuery(price).lte(5000)))2.8 嵌套查询Nested Query适用场景实体类包含集合、对象嵌套字段查询.withQuery(QueryBuilders.nestedQuery(userList,QueryBuilders.matchQuery(userList.userName,张三),ScoreMode.None))2.9 多字段组合查询Multi Match适用场景一个关键词同时在名称、描述、标题中检索.withQuery(QueryBuilders.multiMatchQuery(手机,name,desc,title))2.10 自定义原生DSL查询适用场景超复杂查询直接使用ES原生语法Stringdsl{\match_all\:{}};QueryquerynewStringQuery(dsl);SearchHitsProducthitstemplate.search(query,Product.class);三、复杂查询结果统一解析工具所有查询返回统一封装为SearchHits解析工具类// 解析SearchHits为ListTprivateTListTparseResult(SearchHitsTsearchHits){returnsearchHits.stream().map(SearchHit::getContent).collect(Collectors.toList());}四、Spring Data Elasticsearch 复杂查询优化建议优先使用filter过滤代替must性能提升5~10倍keyword字段做精准匹配text字段做全文检索分页避免深度分页使用search_after替代聚合查询关闭文档返回提升性能高亮只配置需要的字段布尔查询合理组合must/should/filter五、完整查询开发流程图接收前端查询参数构建NativeSearchQuery配置BoolQuery组合条件添加范围/模糊/精准/过滤条件配置分页/排序/高亮/聚合ElasticsearchRestTemplate执行查询解析SearchHits结果集封装VO/DTO返回前端六、总结Spring Data Elasticsearch 基于NativeSearchQuery ElasticsearchRestTemplate可以实现ES所有原生DSL支持的复杂查询无需手写REST请求代码更优雅、更易维护。本文覆盖生产环境10大高频复杂查询场景布尔组合查询范围查询精准/模糊匹配分页排序高亮显示聚合统计过滤查询嵌套查询多字段查询原生DSL查询掌握以上技能你可以轻松应对电商搜索、日志检索、数据筛选、统计分析等所有复杂业务场景。The End点点关注收藏不迷路