一、前言 Elasticsearch 是一个分布式的 RESTful 风格的搜索和数据分析引擎,能够解决越来越多的用例。作为 Elastic Stack 的核心,它集中存储您的数据,帮助您发现意料之中以及意料之外的情况。
Elasticsearch 是一个实时的分布式搜索分析引擎, 它能让你以一个之前从未有过的速度和规模,去探索你的数据。 它被用作全文检索、结构化搜索、分析以及这三个功能的组合。
二、安装 2.1 环境配置 在安装Elasticsearch引擎之前,必须安装ES需要的软件环境,安装Java JDK和配置JAVA_HOME环境变量,ElasticSearch对JRE的版本是敏感的,错误的版本,会导致ElasticSearch无法运行,下载归档的JRE,请从Java Archive下载合适的版本。
2.2 下载ElasticSearch 从官方下载中心 ElasticSearch Download 下载ElasticSearch安装包,在楼主截图时,ES的最新版本是8.0.0,本文使用旧版本7.16.2,打开 past releases 选择过去的版本安装,下载zip文件格式。
2.3 开启ElasticSearch 服务 将zip文件解压到"E:\Program",进入 "E:\Program\elasticsearch-7.16.2\bin" 目录,双击执行 elasticsearch.bat,该脚本文件执行 ElasticSearch 安装程序,稍等片刻,打开浏览器,输入 http://localhost:9200 ,显式以下画面,说明ES安装成功。
2.4 将ElasticSearch 安装成Windows服务(可选) 1,打开DOS命令行界面,切换到ElasticSearch的bin目录,执行
service.bat install
2,启动ElasticSearch服务
service.bat start
3,在run界面,查看ElasticSearch服务
services.msc
三、Java整合Elasticsearch比较 Java操作ElasticSearch有两种方式,一个是通过ES的9300端口使用TCP的方式操作,另一种是通过ES的9200端口使用HTTP的方式。
1)9300 TCP
spring-data-elasticsearch:transport-api.jar
springboot 版本不同, transport-api.jar 不同,不能适配 es 版本
7.x 已经不建议使用,8 以后就要废弃
2)9200 HTTP
JestClient:非官方,更新慢
RestTemplate:模拟发 HTTP 请求,ES 很多操作需要自己封装,麻烦
HttpClient:同上
Elasticsearch-Rest-Client:官方 RestClient,封装了 ES 操作,API 层次分明,上手简单
综上所述,选择Elasticsearch-Rest-Client(elasticsearch-rest-high-level-client)是最优的选择,下面记录如何整合
Elasticsearch-Rest-Client 官方文档
四、SpringBoot整合Spring Data Elasticsearch 4.1 引入依赖 新建一个基础的springboot项目,本文使用的springboot版本为:2.6.2,新增以下依赖:
1 2 3 4 5 6 7 8 9 10 11 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.71</version> </dependency>
4.2 配置 application.yml 1 2 3 4 5 6 7 8 9 spring: data: elasticsearch: client: reactive: endpoints: 127.0.0.1:9200 elasticsearch: rest: uris: 127.0.0.1:9200
4.3 编码 定义实体
User.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 @Builder @Setter @Getter @Setting(shards = 3, replicas = 1) @Document(indexName = "index_user", createIndex = false) public class User { @Id @Field(store = true, name = "user_id", type = FieldType.Keyword) private String userId; @Field(store = true, searchAnalyzer = "ik_max_word", analyzer = "ik_max_word") private String name; @Field(store = true, name = "login_name", type = FieldType.Keyword) private String loginName; @Field(store = true, type = FieldType.Integer) private Integer age; @Field(store = true, type = FieldType.Date) private Date birthday; @Field(store = true, searchAnalyzer = "ik_max_word", analyzer = "ik_max_word") private String desc; @Field(store = true, name = "head_url", type = FieldType.Keyword) private String headUrl; }
UserService.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public interface UserService { User save(User user); void update(User user); User getById(String userId); String delete(String userId); SearchHits<User> searchForPage(User user); SearchHits<User> highlight(User user); SearchHits<User> sort(User user); }
UserServiceImpl.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 @Service public class UserServiceImpl implements UserService { @Autowired private ElasticsearchRestTemplate elasticsearchRestTemplate; @Override public User save(User user) { User u = elasticsearchRestTemplate.save(user); return u; } @Override public void update(User user) { try { Document document = Document.from(objectToMap(user)); UpdateQuery updateQuery = UpdateQuery.builder(user.getUserId()) // 2 是文档的ID .withDocument(document) .build(); UpdateResponse result = elasticsearchRestTemplate.update(updateQuery, IndexCoordinates.of("index_user")); } catch (IllegalAccessException e) { } } @Override public User getById(String userId) { return elasticsearchRestTemplate.get(userId, User.class); } @Override public String delete(String userId) { String result = elasticsearchRestTemplate.delete(userId, User.class); return result; } @Override public SearchHits<User> searchForPage(User user) { Pageable pageable = PageRequest.of(0,10); // page 从第 0 页开始 Query query = new NativeSearchQueryBuilder() .withQuery(QueryBuilders.matchQuery("desc", user.getDesc())) .withQuery(QueryBuilders.termQuery("age", user.getAge())) .withPageable(pageable) .build(); SearchHits<User> result = elasticsearchRestTemplate.search(query, User.class); return result; } @Override public SearchHits<User> highlight(User user) { Pageable pageable = PageRequest.of(0,10); // page 从第 0 页开始 HighlightBuilder.Field highlightField = new HighlightBuilder.Field("desc") .preTags("<span>") .postTags("</span>"); Query query = new NativeSearchQueryBuilder() .withQuery(QueryBuilders.matchQuery("desc", user.getDesc())) .withHighlightFields(highlightField) .withPageable(pageable) .build(); SearchHits<User> result = elasticsearchRestTemplate.search(query, User.class); return result; } @Override public SearchHits<User> sort(User user) { Pageable pageable = PageRequest.of(0,10); // page 从第 0 页开始 HighlightBuilder.Field highlightField = new HighlightBuilder.Field("desc") .preTags("<span>") .postTags("</span>"); SortBuilder<FieldSortBuilder> sortBuilder = new FieldSortBuilder("age").order(SortOrder.DESC); Query query = new NativeSearchQueryBuilder() .withQuery(QueryBuilders.matchQuery("desc", user.getDesc())) .withHighlightFields(highlightField) .withSort(sortBuilder) // 排序可加多个 .withPageable(pageable) .build(); SearchHits<User> result = elasticsearchRestTemplate.search(query, User.class); return result; } public Map<String, Object> objectToMap(Object obj) throws IllegalAccessException { Map<String, Object> map = new HashMap<String, Object>(); Class<?> clazz = obj.getClass(); for (Field field : clazz.getDeclaredFields()) { field.setAccessible(true); String fieldName = field.getName(); Object value = field.get(obj); if (!fieldName.equals("userId")) { map.put(fieldName, value); } } return map; } }
4.4 测试 UserController.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 @RestController @RequestMapping("/api/user") public class UserController { @Autowired private UserService userService; @RequestMapping( value = "/saveUser") public String saveUser(@RequestParam(value ="birth") @DateTimeFormat(pattern="yyyy-MM-dd") Date birthday, User user){ user.setBirthday(birthday); userService.save(user); return "sucss"; } @RequestMapping( value = "/updateUser") public String updateUser(User user){ userService.update(user); return "sucss"; } @RequestMapping( value = "/getUser", method = RequestMethod.GET) public User getUser(String userId){ return userService.getById(userId); } @RequestMapping( value = "/deleteUser", method = RequestMethod.GET) public String deleteUser(String userId){ userService.delete(userId); return "sucss"; } @RequestMapping( value = "/searchForPage", method = RequestMethod.GET) public SearchHits<User> searchForPage(User user){ return userService.searchForPage(user); } @RequestMapping( value = "/highlight", method = RequestMethod.GET) public SearchHits<User> highlight(User user){ return userService.highlight(user); } @RequestMapping( value = "/sort", method = RequestMethod.GET) public SearchHits<User> sort(User user){ return userService.sort(user); } }
新增: http://127.0.0.1:8080/api/user/saveUser?userId=001&name=wno704&birth=2021-03-04&loginName=测试&age=23&desc=这是第一个用户&headUrl=/image/001.png
更新: http://127.0.0.1:8080/api/user/updateUser?userId=001&name=wno704&birth=2021-03-04&loginName=测试1&age=26&desc=这是第一个用户1&headUrl=/image/002.png
根据条件查询: http://127.0.0.1:8080/api/user/getUser?userId=001
根据条件删除: http://127.0.0.1:8080/api/user/deleteUser?userId=001>
翻页查询: http://127.0.0.1:8080/api/user/searchForPage?desc=001&age=26
高亮查询: http://127.0.0.1:8080/api/user/highlight?desc=用户
排序查询: http://127.0.0.1:8080/api/user/sort?desc=用户
五、SpringBoot整合RestHighLevelClient 5.1 引入依赖 新建一个基础的springboot项目,本文使用的springboot版本为:2.6.2,新增以下依赖:
1 2 3 4 5 6 7 8 9 10 11 12 <!-- https://mvnrepository.com/artifact/org.elasticsearch.client/elasticsearch-rest-high-level-client --> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>7.16.1</version> </dependency> <!-- https://mvnrepository.com/artifact/org.elasticsearch/elasticsearch --> <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>7.16.2</version> </dependency>
5.2 配置 application.yml 1 2 3 4 5 6 7 8 spring: elasticsearch: nodes: 127.0.0.1:9200 username: password: elasticsearch: ip: 127.0.0.1:9200
5.3 ElasticsearchRestClient ElasticsearchRestClient.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 @Configuration public class ElasticsearchRestClient { public static final RequestOptions COMMON_OPTIONS; /** * ES地址,ip:port */ @Value("${elasticsearch.ip}") String ipPort; static { // RequestOptions类保存了请求的部分,这些部分应该在同一个应用程序中的许多请求之间共享。 // 创建一个singqleton实例,并在所有请求之间共享它。可以设置请求头之类的一些配置 RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder(); // builder.addHeader("Authorization", "Bearer " + TOKEN); /* builder.setHttpAsyncResponseConsumerFactory( new HttpAsyncResponseConsumerFactory .HeapBufferedResponseConsumerFactory(30 * 1024 * 1024 *1024));*/ COMMON_OPTIONS = builder.build(); } //创建ES实例 @Bean public RestHighLevelClient restHighLevelClient(){ return new RestHighLevelClient(RestClient.builder(makeHttpHost(ipPort))); } private HttpHost makeHttpHost(String s) { String[] address = s.split(":"); String ip = address[0]; int port = Integer.parseInt(address[1]); return new HttpHost(ip, port, "http"); } }
5.4 测试 这里我们使用测试单元进行功能测试,测试基础使用代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 @SpringBootTest class ElasticsearchClientApplicationTests { @Data @ToString @Accessors(chain=true) class User{ private String name; private int age; private char sex; private Date birth; } @Autowired RestHighLevelClient restHighLevelClient; }
数据插入示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 @Test void insertJson() throws IOException { //测试保存 IndexRequest request = new IndexRequest("personinfo"); request.id("2"); String jsonString = "{" + "\"name\":\"wno706\"," + "\"address\":\"陕西省西安市未央区建元二路158号-1105\"," + "\"age\":\"24\"," + "\"salary\":\"88888\"," + "\"birth\":\"2013-06-10\"," + "\"desc\":\"trying out Elasticsearch\"" + "}"; request.source(jsonString, XContentType.JSON); IndexResponse index= restHighLevelClient.index(request, ElasticsearchRestClient.COMMON_OPTIONS); System.out.printf("index-%s---%s-------------:",index.getId(),index.toString()); } @Test void insertMap() throws IOException { //测试保存 IndexRequest request = new IndexRequest("personinfo"); request.id("2"); request.source("name","wno706","address","陕西省西安市未央区建元二路158号-1105","birth","2013-06-10"); IndexResponse index= restHighLevelClient.index(request, ElasticsearchRestClient.COMMON_OPTIONS); System.out.printf("index-%s---%s-------------:",index.getId(),index.toString()); }
创建索引 1 2 3 4 5 6 7 @Test void createIndex() throws IOException { CreateIndexRequest request = new CreateIndexRequest("user"); CreateIndexResponse response = restHighLevelClient.indices().create(request, RequestOptions.DEFAULT); boolean ack = response.isAcknowledged(); System.out.printf("%s-------------:",ack); }
删除索引 1 2 3 4 5 6 @Test void deleteIndex() throws IOException { DeleteIndexRequest request = new DeleteIndexRequest("user"); AcknowledgedResponse acknowledgedResponse = restHighLevelClient.indices().delete(request, RequestOptions.DEFAULT); System.out.printf("索引操作===>%s",acknowledgedResponse.isAcknowledged()); }
新增数据 1 2 3 4 5 6 7 8 9 10 11 @Test void insertDoc() throws IOException { IndexRequest request = new IndexRequest(); request.index("user").id("1"); User user = new User().setName("wno704").setAge(18).setSex('男').setBirth(new Date()); ObjectMapper mapper = new ObjectMapper(); String userJson = mapper.writeValueAsString(user); request.source(userJson, XContentType.JSON); IndexResponse indexResponse = restHighLevelClient.index(request, RequestOptions.DEFAULT); System.out.printf("Result===>%s==%s===%s",indexResponse.getId(),indexResponse,indexResponse.getResult()); }
查询数据 1 2 3 4 5 6 7 8 @Test void selectDoc() throws IOException{ GetRequest request = new GetRequest(); request.index("user").id("1"); GetResponse documentFields = restHighLevelClient.get(request, RequestOptions.DEFAULT); System.out.printf("===>%s",documentFields.getSourceAsString()); }
删除数据 1 2 3 4 5 6 7 @Test void deleteDoc() throws IOException{ DeleteRequest request = new DeleteRequest(); request.index("user").id("1"); DeleteResponse response = restHighLevelClient.delete(request, RequestOptions.DEFAULT); System.out.printf("===>%s",response.toString()); }
批量添加数据 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 @Test void bulkInsertDoc() throws IOException{ BulkRequest request = new BulkRequest(); ObjectMapper mapper = new ObjectMapper(); User user1 = new User().setName("ww1").setAge(18).setSex('男'); User user2 = new User().setName("ww2").setAge(17).setSex('女'); User user3 = new User().setName("ww3").setAge(16).setSex('女'); request.add(new IndexRequest().index("user").id("1").source(mapper.writeValueAsString(user1),XContentType.JSON)); request.add(new IndexRequest().index("user").id("2").source(mapper.writeValueAsString(user2),XContentType.JSON)); request.add(new IndexRequest().index("user").id("3").source(mapper.writeValueAsString(user3),XContentType.JSON )); BulkResponse response = restHighLevelClient.bulk(request, RequestOptions.DEFAULT); System.out.printf("Took===>%s",response.getTook()); System.out.printf("Items===>%s",response.getItems()); }
批量删除数据 1 2 3 4 5 6 7 8 9 10 11 12 @Test void bulkDeleteDoc() throws IOException{ BulkRequest request = new BulkRequest(); request.add(new DeleteRequest().index("user").id("1")); request.add(new DeleteRequest().index("user").id("2")); request.add(new DeleteRequest().index("user").id("3")); BulkResponse response = restHighLevelClient.bulk(request, RequestOptions.DEFAULT); System.out.printf("Took===>%s",response.getTook()); System.out.printf("Items===>%s",response.getItems()); }
查询全部 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 @Test void searchDoc() throws IOException{ SearchRequest request = new SearchRequest(); request.indices("user"); request.source(new SearchSourceBuilder().query(QueryBuilders.matchAllQuery())); SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT); SearchHits hits = response.getHits(); System.out.printf("TotalHits===>%s",hits.getTotalHits()); System.out.printf("Took===>%s",response.getTook()); hits.forEach(h ->{ System.out.printf("===>%s",h.getSourceAsString()); }); }
条件查询 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 @Test void searchQueryDoc() throws IOException{ SearchRequest request = new SearchRequest(); request.indices("user"); request.source(new SearchSourceBuilder().query(QueryBuilders.termQuery("age",18))); SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT); SearchHits hits = response.getHits(); System.out.printf("TotalHits===>%s",hits.getTotalHits()); System.out.printf("Took===>%s",response.getTook()); hits.forEach(h ->{ System.out.printf("===>%s",h.getSourceAsString()); }); }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 #### 分页查询 ```java @Test void searchPageDoc() throws IOException{ SearchRequest request = new SearchRequest(); request.indices("user"); SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery()); builder.from(0); builder.size(2); request.source(builder); SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT); SearchHits hits = response.getHits(); System.out.printf("TotalHits===>%s",hits.getTotalHits()); System.out.printf("Took===>%s",response.getTook()); hits.forEach(h ->{ System.out.printf("===>%s",h.getSourceAsString()); }); }
查询排序 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 @Test void searchOrderDoc() throws IOException{ SearchRequest request = new SearchRequest(); request.indices("user"); SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery()); builder.sort("age", SortOrder.DESC); request.source(builder); SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT); SearchHits hits = response.getHits(); System.out.printf("TotalHits===>%s",hits.getTotalHits()); System.out.printf("Took===>%s",response.getTook()); hits.forEach(h ->{ System.out.printf("===>%s",h.getSourceAsString()); }); }
查询指定字段 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 @Test void searchSourceDoc() throws IOException{ SearchRequest request = new SearchRequest(); request.indices("user"); SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery()); builder.sort("age", SortOrder.ASC); String[] excludes = {"sex"}; String[] includes = {}; builder.fetchSource(includes, excludes); request.source(builder); SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT); SearchHits hits = response.getHits(); System.out.printf("TotalHits===>%s",hits.getTotalHits()); System.out.printf("Took===>%s",response.getTook()); hits.forEach(h ->{ System.out.printf("===>%s",h.getSourceAsString()); }); }
组合查询 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 @Test void searchBoolDoc() throws IOException{ SearchRequest request = new SearchRequest(); request.indices("user"); SearchSourceBuilder builder = new SearchSourceBuilder(); BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); boolQueryBuilder.must(QueryBuilders.matchQuery("age", 18)); boolQueryBuilder.mustNot(QueryBuilders.matchQuery("sex", "女")); builder.query(boolQueryBuilder); request.source(builder); SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT); SearchHits hits = response.getHits(); System.out.printf("TotalHits===>%s",hits.getTotalHits()); System.out.printf("Took===>%s",response.getTook()); hits.forEach(h ->{ System.out.printf("===>%s",h.getSourceAsString()); }); }
范围查询 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 @Test void searchRangeDoc() throws IOException{ SearchRequest request = new SearchRequest(); request.indices("user"); SearchSourceBuilder builder = new SearchSourceBuilder(); RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery("age"); rangeQuery.gte(17); rangeQuery.lte(18); builder.query(rangeQuery); request.source(builder); SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT); SearchHits hits = response.getHits(); System.out.printf("TotalHits===>%s",hits.getTotalHits()); System.out.printf("Took===>%s",response.getTook()); hits.forEach(h ->{ System.out.printf("===>%s",h.getSourceAsString()); }); }
模糊查询 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 @Test void searchFuzzyDoc() throws IOException{ SearchRequest request = new SearchRequest(); request.indices("user"); SearchSourceBuilder builder = new SearchSourceBuilder(); builder.query(QueryBuilders.fuzzyQuery("name", "ww").fuzziness(Fuzziness.ONE)); //.fuzziness(Fuzziness.ONE)匹配多少个 request.source(builder); SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT); SearchHits hits = response.getHits(); System.out.printf("TotalHits===>%s",hits.getTotalHits()); System.out.printf("Took===>%s",response.getTook()); hits.forEach(h ->{ System.out.printf("===>%s",h.getSourceAsString()); }); }
高亮查询 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 @Test void searchHighlighterDoc() throws IOException{ SearchRequest request = new SearchRequest(); request.indices("user"); SearchSourceBuilder builder = new SearchSourceBuilder(); TermsQueryBuilder termQueryBuilder = QueryBuilders.termsQuery("name", "ww1"); //准确查询 //FuzzyQueryBuilder fuzzyQueryBuilde = QueryBuilders.fuzzyQuery("name", "ww"); //模糊 HighlightBuilder highlightBuilder = new HighlightBuilder(); highlightBuilder.preTags("<font color='red'>"); highlightBuilder.postTags("</font>"); highlightBuilder.field("name"); builder.highlighter(highlightBuilder); builder.query(termQueryBuilder); //builder.query(fuzzyQueryBuilde); request.source(builder); SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT); SearchHits hits = response.getHits(); System.out.printf("TotalHits===>%s",hits.getTotalHits()); System.out.printf("Took===>%s",response.getTook()); hits.forEach(h ->{ System.out.printf("===>%s",h); }); }
聚合查询 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 @Test void searchAggregationDoc() throws IOException{ SearchRequest request = new SearchRequest(); request.indices("user"); SearchSourceBuilder builder = new SearchSourceBuilder(); MaxAggregationBuilder aggregationBuilder = AggregationBuilders.max("maxAge").field("age"); builder.aggregation(aggregationBuilder); request.source(builder); SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT); SearchHits hits = response.getHits(); System.out.printf("TotalHits===>%s",hits.getTotalHits()); System.out.printf("Took===>%s",response.getTook()); System.out.printf("Aggregations===>%s",response.getAggregations()); }
聚合查询-分组 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 @Test void searchAggregationGroupDoc() throws IOException{ SearchRequest request = new SearchRequest(); request.indices("user"); SearchSourceBuilder builder = new SearchSourceBuilder(); AggregationBuilder aggregationBuilder = AggregationBuilders.terms("ageGroup").field("age"); builder.aggregation(aggregationBuilder); request.source(builder); SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT); SearchHits hits = response.getHits(); System.out.printf("TotalHits===>%s",hits.getTotalHits()); System.out.printf("Took===>%s",response.getTook()); System.out.printf("Aggregations===>%s",response.getAggregations()); }