- 1. 依赖
- 2. 客户端
- 3. 索引
- 4. 文档
- 4.1 新增
- 4.2 修改—-UpdateRequest
- 4.3 删除
- 4.4 查询
- 4.3.1 主键查询—-GetRequest
- 4.3.2 高级查询—-SearchRequest
- 4.3.2.1 全量查询—-matchAllQuery()
- 4.3.2.2 条件查询—-termQuery(“字段”, “值”)
- 4.3.2.3 通配符查询—-wildcardQuery(“字段”, “值“)
- 4.3.2.4 分页查询—-builder.from(起始值)+builder.size(页量)
- 4.3.2.5 排序查询—-builder.sort(“字段”, SortOrder.DESC/ASC)
- 4.3.2.6 过滤字段查询—-builder.fetchSource(includes,excludes)
- 4.3.2.7 组合查询—-boolQuery()
- 4.3.2.8 范围查询—-rangeQuery(“字段”)
- 4.3.2.9 纠错查询—-fuzzyQuery(“字段”, “值”).fuzziness(Fuzziness.ONE/TOW/AUTO)
- 4.3.2.10 高亮查询—-HighlightBuilder
- 4.3.2.11 聚合统计查询—-AggregationBuilders.max(“聚合名称”)|min()|count()|avg()|…|.field(“聚合字段”)
- 4.3.2.12 分组统计查询—-AggregationBuilders.terms(“分组名称”).field(“分组字段”)
1. 依赖
<dependencies><!-- elasticsearch --><dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>7.8.0</version></dependency><!-- elasticsearch 的客户端 --><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.8.0</version></dependency><!-- elasticsearch 依赖 2.x 的 log4j --><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>2.8.2</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.8.2</version></dependency><!-- jackson --><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.9</version></dependency></dependencies>
2. 客户端
早期版本的客户端对象已经不再推荐使用,且在未来版本中会被删除,所以这里采用高级 REST 客户端对象
/*** ES 客户端的创建* @author JShawn 2021/8/5 11:24*/public class EsClient_Test {/*** ES集群地址*/private static final String ES_CLUSTER_HOST_PORT = "hadoop101:9200,hadoop102:9200,hadoop103:9200";/*** ES连接方式*/private static final String ES_SCHEMA = "http";public static void main(String[] args) throws IOException {// 1. 获取ES客户端// 1. ES地址配置String[] clusters = ES_CLUSTER_HOST_PORT.split(",");HttpHost[] hosts = new HttpHost[clusters.length];for (int i = 0; i < clusters.length; i++) {String[] address = clusters[i].split(":");HttpHost httpHost = new HttpHost(address[0], Integer.parseInt(address[1]), ES_SCHEMA);hosts[i] = httpHost;}// 2. 创建客户端RestHighLevelClient restHighLevelClient = new RestHighLevelClient(RestClient.builder(hosts));// 3. 关闭客户端restHighLevelClient.close();}}
3. 索引
3.1 创建—-CreateIndexRequest
/*** 1. 创建索引* @param restHighLevelClient ES客户端* @throws IOException*/private static void createIndex(RestHighLevelClient restHighLevelClient) throws IOException {CreateIndexRequest indexRequest = new CreateIndexRequest("car");CreateIndexResponse response = restHighLevelClient.indices().create(indexRequest, RequestOptions.DEFAULT);LOGGER.info(response.isAcknowledged());}
3.2 查询
3.2.1 查询单个索引—-GetIndexRequest
/*** 2. 查看单个索引** @param restHighLevelClient ES客户端*/private static void getIndex(RestHighLevelClient restHighLevelClient) throws IOException {GetIndexRequest getIndexRequest = new GetIndexRequest("car");GetIndexResponse response = restHighLevelClient.indices().get(getIndexRequest, RequestOptions.DEFAULT);LOGGER.info("别名:" + response.getAliases());LOGGER.info("indices:" + response.getIndices());LOGGER.info("映射结构:" + response.getMappings());LOGGER.info("settings:" + response.getSettings());}
3.2.2 查询全部索引—-GetAliasesRequest
/*** 3. 查看全部索引** @param restHighLevelClient ES客户端*/private static void getAllIndex(RestHighLevelClient restHighLevelClient) throws IOException {GetAliasesRequest aliasesRequest = new GetAliasesRequest();GetAliasesResponse response = restHighLevelClient.indices().getAlias(aliasesRequest,RequestOptions.DEFAULT);Map<String, Set<AliasMetadata>> aliases = response.getAliases();Set<String> indices = aliases.keySet();for (String key : indices) {LOGGER.info("索引:" + key);}}
3.3 删除—-DeleteIndexRequest
/*** 4. 删除索引** @param restHighLevelClient ES客户端*/private static void deleteIndex(RestHighLevelClient restHighLevelClient) throws IOException {DeleteIndexRequest deleteRequest = new DeleteIndexRequest("student1");AcknowledgedResponse response = restHighLevelClient.indices().delete(deleteRequest, RequestOptions.DEFAULT);LOGGER.info(response.isAcknowledged());}
4. 文档
4.1 新增
4.1.1 单文档新增—-IndexRequest
/*** 1.新增文档** @param restHighLevelClient ES客户端*/private static void insertDoc(RestHighLevelClient restHighLevelClient) throws IOException {// 1. 创建数据,再转换成jsonCar car = new Car("BMW", "blue", 300000);ObjectMapper objectMapper = new ObjectMapper();String carJson = objectMapper.writeValueAsString(car);// 2. 封装数据IndexRequest request = new IndexRequest("car");// 2.1 设置唯一性标识,不设置ES自动生成request.id("1001");// 2.2 将数据封装到请求体中request.source(carJson,XContentType.JSON);// 3. 发送请求,获取响应IndexResponse response = restHighLevelClient.index(request, RequestOptions.DEFAULT);LOGGER.info("index:" + response.getIndex());LOGGER.info("id:" + response.getId());LOGGER.info("result:" + response.getResult());}
4.1.2 批量新增—-BulkRequest
/*** 2. 批量新增文档** @param restHighLevelClient ES客户端*/private static void batchInsertDoc(RestHighLevelClient restHighLevelClient) throws IOException {// 1. 创建BulkRequest对象BulkRequest bulkRequest = new BulkRequest();// 2. 封装数据bulkRequest.add(new IndexRequest("car").id("1001").source(XContentType.JSON, "name", "bmw", "color", "blue", "price", 300000));bulkRequest.add(new IndexRequest("car").id("1002").source(XContentType.JSON, "name", "audi", "color", "write", "price", 400000));bulkRequest.add(new IndexRequest("car").id("1003").source(XContentType.JSON, "name", "bens", "color", "black", "price", 500000));bulkRequest.add(new IndexRequest("car").id("1004").source(XContentType.JSON, "name", "bmw", "color", "yellow", "price", 600000));bulkRequest.add(new IndexRequest("car").id("1005").source(XContentType.JSON, "name", "audi", "color", "blue", "price", 700000));bulkRequest.add(new IndexRequest("car").id("1006").source(XContentType.JSON, "name", "bens", "color", "blue", "price", 800000));// 3. 发送请求,获取响应BulkResponse response = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);LOGGER.info("用时:" + response.getTook());LOGGER.info("items:" + response.getItems());}
4.2 修改—-UpdateRequest
/*** 3. 修改文档** @param restHighLevelClient ES客户端*/private static void updateDoc(RestHighLevelClient restHighLevelClient) throws IOException {// 1. 创建UpdateRequest对象UpdateRequest request = new UpdateRequest();// 2.封装数据request.index("car");request.id("1004");request.doc(XContentType.JSON, "color", "yellow");// 3. 发送请求,获取响应UpdateResponse response = restHighLevelClient.update(request, RequestOptions.DEFAULT);LOGGER.info("_index:" + response.getIndex());LOGGER.info("_id:" + response.getId());LOGGER.info("_result:" + response.getResult());}
4.3 删除
4.3.1 主键删除—-DeleteRequest
/*** 5. 主键删除文档** @param restHighLevelClient ES客户端*/private static void deleteDoc(RestHighLevelClient restHighLevelClient) throws IOException {// 1. 创建DeleteRequest对象DeleteRequest deleteRequest = new DeleteRequest("car");// 2.封装数据deleteRequest.id("1004");// 3. 发送请求,获取响应DeleteResponse response = restHighLevelClient.delete(deleteRequest, RequestOptions.DEFAULT);LOGGER.info(response.toString());}
4.3.2 批量删除—-BulkRequest
/*** 6. 批量删除文档* @param restHighLevelClient ES客户端*/private static void batchDeleteDoc(RestHighLevelClient restHighLevelClient) throws IOException {// 1. 创建BulkRequest对象BulkRequest request = new BulkRequest();// 2. 封装数据request.add(new DeleteRequest("car").id("1001"));request.add(new DeleteRequest("car").id("1002"));request.add(new DeleteRequest("car").id("1003"));request.add(new DeleteRequest("car").id("1004"));request.add(new DeleteRequest("car").id("1005"));request.add(new DeleteRequest("car").id("1006"));// 3. 发送请求,获取响应BulkResponse response = restHighLevelClient.bulk(request, RequestOptions.DEFAULT);LOGGER.info("took:" + response.getTook());LOGGER.info("items:" + response.getItems());}
4.4 查询
4.3.1 主键查询—-GetRequest
/*** 4. 查询文档** @param restHighLevelClient ES客户端*/private static void getDoc(RestHighLevelClient restHighLevelClient) throws IOException {// 1. 创建GetRequest对象GetRequest request = new GetRequest("car");// 2.封装数据request.id("1001");// 3. 发送请求,获取响应GetResponse response = restHighLevelClient.get(request, RequestOptions.DEFAULT);LOGGER.info("_index:" + response.getIndex());LOGGER.info("_type:" + response.getType());LOGGER.info("source" + response.getSourceAsString());}
4.3.2 高级查询—-SearchRequest
4.3.2.1 全量查询—-matchAllQuery()
/*** 2. 全量查询 --- matchAllQuery()** @param restHighLevelClient ES客户端*/private static void getAllDoc(RestHighLevelClient restHighLevelClient) throws IOException {// 1. 创建搜索请求对象SearchRequest request = new SearchRequest();request.indices("car");// 2. 构建查询请求体SearchSourceBuilder builder = new SearchSourceBuilder();builder.query(QueryBuilders.matchAllQuery());request.source(builder);// 3. 发送请求,接收响应SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);SearchHits hits = response.getHits();LOGGER.info("耗时:" + response.getTook());LOGGER.info("是否超时:" + response.isTimedOut());LOGGER.info("总数:" + hits.getTotalHits());LOGGER.info("maxScore:" + hits.getMaxScore());LOGGER.info("hits =======================>>");for (SearchHit hit : hits) {// 4. 输出数据LOGGER.info(hit.getSourceAsString());}LOGGER.info("<<========================");}
4.3.2.2 条件查询—-termQuery(“字段”, “值”)
注意:term条件不分词,keyword不分词,text分词
/*** 3. 条件查询---termQuery("字段", "值")** @param restHighLevelClient ES客户端*/private static void getDocByTermQuery(RestHighLevelClient restHighLevelClient) throws IOException {// 1. 创建搜索请求对象SearchRequest request = new SearchRequest("car");// 2. ******构建查询请求体******SearchSourceBuilder builder = new SearchSourceBuilder();builder.query(QueryBuilders.termQuery("name", "bmw"));request.source(builder);// 3. 发送请求,接收响应SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);SearchHits hits = response.getHits();LOGGER.info("耗时:" + response.getTook());LOGGER.info("是否超时:" + response.isTimedOut());LOGGER.info("总数:" + hits.getTotalHits());LOGGER.info("maxScore:" + hits.getMaxScore());LOGGER.info("hits =======================>>");for (SearchHit hit : hits) {// 4. 输出数据LOGGER.info(hit.getSourceAsString());}LOGGER.info("<<========================");}
4.3.2.3 通配符查询—-wildcardQuery(“字段”, “值“)
注意:wildcard条件不分词,keyword不分词,text分词
/*** 4. 通配符查询 --- wildcardQuery("字段", "*值*")** @param restHighLevelClient ES客户端* @throws IOException*/private static void getDocByWildcard(RestHighLevelClient restHighLevelClient) throws IOException {// 1. 创建搜索请求对象SearchRequest request = new SearchRequest("car");// 2.******构建查询请求体******SearchSourceBuilder builder = new SearchSourceBuilder();WildcardQueryBuilder wildcardQueryBuilder = QueryBuilders.wildcardQuery("name", "*m*");builder.query(wildcardQueryBuilder);request.source(builder);// 3. 发送请求,接收响应SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);SearchHits hits = response.getHits();LOGGER.info("耗时:" + response.getTook());LOGGER.info("是否超时:" + response.isTimedOut());LOGGER.info("总数:" + hits.getTotalHits());LOGGER.info("maxScore:" + hits.getMaxScore());LOGGER.info("hits =======================>>");for (SearchHit hit : hits) {// 4. 输出数据LOGGER.info(hit.getSourceAsString());}LOGGER.info("<<========================");}
4.3.2.4 分页查询—-builder.from(起始值)+builder.size(页量)
/*** 5. 分页查询** builder.from(起始值); from = (pageNo-1) * size* builder.size(页量);** @param restHighLevelClient ES客户端*/private static void getDocByPage(RestHighLevelClient restHighLevelClient) throws IOException {// 1. 创建搜索请求对象SearchRequest request = new SearchRequest("car");// 2.******构建查询请求体******SearchSourceBuilder builder = new SearchSourceBuilder();builder.query(QueryBuilders.matchAllQuery());builder.from(3); // from = (pageNo-1) * pageSizebuilder.size(2);request.source(builder);// 3. 发送请求,接收响应SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);SearchHits hits = response.getHits();LOGGER.info("耗时:" + response.getTook());LOGGER.info("是否超时:" + response.isTimedOut());LOGGER.info("总数:" + hits.getTotalHits());LOGGER.info("maxScore:" + hits.getMaxScore());LOGGER.info("hits =======================>>");for (SearchHit hit : hits) {// 4. 输出数据LOGGER.info(hit.getSourceAsString());}LOGGER.info("<<========================");}
4.3.2.5 排序查询—-builder.sort(“字段”, SortOrder.DESC/ASC)
text字段不支持聚合和排序
/*** 6. 排序查询** builder.sort("字段", SortOrder.DESC/ASC);** @param restHighLevelClient ES客户端*/private static void getDocBySort(RestHighLevelClient restHighLevelClient) throws IOException {// 1. 创建搜索请求对象SearchRequest request = new SearchRequest("car");// 2.******构建查询请求体******SearchSourceBuilder builder = new SearchSourceBuilder();builder.query(QueryBuilders.matchAllQuery());builder.sort("price", SortOrder.DESC);request.source(builder);// 3. 发送请求,接收响应SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);SearchHits hits = response.getHits();LOGGER.info("耗时:" + response.getTook());LOGGER.info("是否超时:" + response.isTimedOut());LOGGER.info("总数:" + hits.getTotalHits());LOGGER.info("maxScore:" + hits.getMaxScore());LOGGER.info("hits =======================>>");for (SearchHit hit : hits) {// 4. 输出数据LOGGER.info(hit.getSourceAsString());}LOGGER.info("<<========================");}
4.3.2.6 过滤字段查询—-builder.fetchSource(includes,excludes)
/*** 7. 过滤字段查询 --- builder.fetchSource(includes,excludes);** @param restHighLevelClient ES客户端*/private static void getDocByIncludeAndExclude(RestHighLevelClient restHighLevelClient) throws IOException {// 1. 创建搜索请求对象SearchRequest request = new SearchRequest("car");// 2.******构建查询请求体******SearchSourceBuilder builder = new SearchSourceBuilder();String[] includes = {"name"};//String[] excludes = {"price"};builder.fetchSource(includes,new String[]{});request.source(builder);// 3. 发送请求,接收响应SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);SearchHits hits = response.getHits();LOGGER.info("耗时:" + response.getTook());LOGGER.info("是否超时:" + response.isTimedOut());LOGGER.info("总数:" + hits.getTotalHits());LOGGER.info("maxScore:" + hits.getMaxScore());LOGGER.info("hits =======================>>");for (SearchHit hit : hits) {// 4. 输出数据LOGGER.info(hit.getSourceAsString());}LOGGER.info("<<========================");}
4.3.2.7 组合查询—-boolQuery()
/*** 8. 组合查询 --- boolQuery()** @param restHighLevelClient ES客户端*/private static void getDocByBool(RestHighLevelClient restHighLevelClient) throws IOException {// 1. 创建搜索请求对象SearchRequest request = new SearchRequest("car");// 2.******构建查询请求体******SearchSourceBuilder builder = new SearchSourceBuilder();BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();boolQueryBuilder.must(QueryBuilders.matchQuery("name", "bmw"));boolQueryBuilder.must(QueryBuilders.matchQuery("price", 300000));//boolQueryBuilder.mustNot(QueryBuilders.matchQuery("price", 300000));//boolQueryBuilder.should(QueryBuilders.matchQuery("price", 300000));builder.query(boolQueryBuilder);request.source(builder);// 3. 发送请求,接收响应SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);SearchHits hits = response.getHits();LOGGER.info("耗时:" + response.getTook());LOGGER.info("是否超时:" + response.isTimedOut());LOGGER.info("总数:" + hits.getTotalHits());LOGGER.info("maxScore:" + hits.getMaxScore());LOGGER.info("hits =======================>>");for (SearchHit hit : hits) {// 4. 输出数据LOGGER.info(hit.getSourceAsString());}LOGGER.info("<<========================");}
4.3.2.8 范围查询—-rangeQuery(“字段”)
/*** 9. 范围查询 --- rangeQuery("字段")** @param restHighLevelClient ES客户端*/private static void getDocByRange(RestHighLevelClient restHighLevelClient) throws IOException {// 1. 创建搜索请求对象SearchRequest request = new SearchRequest("car");// 2.******构建查询请求体******SearchSourceBuilder builder = new SearchSourceBuilder();RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("price");rangeQueryBuilder.gte(300000);rangeQueryBuilder.lte(500000);builder.query(rangeQueryBuilder);request.source(builder);// 3. 发送请求,接收响应SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);SearchHits hits = response.getHits();LOGGER.info("耗时:" + response.getTook());LOGGER.info("是否超时:" + response.isTimedOut());LOGGER.info("总数:" + hits.getTotalHits());LOGGER.info("maxScore:" + hits.getMaxScore());LOGGER.info("hits =======================>>");for (SearchHit hit : hits) {// 4. 输出数据LOGGER.info(hit.getSourceAsString());}LOGGER.info("<<========================");}
4.3.2.9 纠错查询—-fuzzyQuery(“字段”, “值”).fuzziness(Fuzziness.ONE/TOW/AUTO)
/*** 10. 纠错查询 --- fuzzyQuery("字段", "值").fuzziness(Fuzziness.ONE/TOW/AUTO); //fuzziness()设置容忍错几个字符** @param restHighLevelClient ES客户端*/private static void getDocByFuzzy(RestHighLevelClient restHighLevelClient) throws IOException {// 1. 创建搜索请求对象SearchRequest request = new SearchRequest("car");// 2.******构建查询请求体******SearchSourceBuilder builder = new SearchSourceBuilder();FuzzyQueryBuilder fuzzyQueryBuilder = QueryBuilders.fuzzyQuery("name", "bba").fuzziness(Fuzziness.TWO); //fuzziness()设置容忍错几个字符builder.query(fuzzyQueryBuilder);request.source(builder);// 3. 发送请求,接收响应SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);SearchHits hits = response.getHits();LOGGER.info("耗时:" + response.getTook());LOGGER.info("是否超时:" + response.isTimedOut());LOGGER.info("总数:" + hits.getTotalHits());LOGGER.info("maxScore:" + hits.getMaxScore());LOGGER.info("hits =======================>>");for (SearchHit hit : hits) {// 4. 输出数据LOGGER.info(hit.getSourceAsString());}LOGGER.info("<<========================");}
4.3.2.10 高亮查询—-HighlightBuilder
/*** 11. 高亮查询(前提是有搜索关键词,即条件查询)** HighlightBuilder.filed("字段")* HighlightBuilder.pretTags("前缀")* HighlightBuilder.posttTags("后缀")* @param restHighLevelClient ES客户端*/private static void getDocByHighlight(RestHighLevelClient restHighLevelClient) throws IOException {// 1. 创建搜索请求对象SearchRequest request = new SearchRequest("car");// 2.******构建查询请求体******SearchSourceBuilder builder = new SearchSourceBuilder();// 2.1 首先条件查询QueryBuilder queryBuilder = QueryBuilders.termQuery("name","bmw");// 2.2 构建高亮字段及前后缀HighlightBuilder highlightBuilder = new HighlightBuilder();highlightBuilder.field("name");highlightBuilder.preTags("<font color='red'>");highlightBuilder.postTags("</font>");// 2.3 设置查询方式、高亮对象builder.query(queryBuilder);builder.highlighter(highlightBuilder);// 2.4 交给requestrequest.source(builder);// 3. 发送请求,接收响应SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);SearchHits hits = response.getHits();LOGGER.info("耗时:" + response.getTook());LOGGER.info("是否超时:" + response.isTimedOut());LOGGER.info("总数:" + hits.getTotalHits());LOGGER.info("maxScore:" + hits.getMaxScore());LOGGER.info("hits =======================>>");for (SearchHit hit : hits) {// 4. 输出数据LOGGER.info(hit.getSourceAsString());// 4.1 获取高亮字段LOGGER.info(hit.getHighlightFields());}LOGGER.info("<<========================");}
4.3.2.11 聚合统计查询—-AggregationBuilders.max(“聚合名称”)|min()|count()|avg()|…|.field(“聚合字段”)
text字段不支持聚合和排序
/*** 12. 聚合统计查询------AggregationBuilders.max("聚合名称")|min()|count()|avg()|...|.field("price")** @param restHighLevelClient ES客户端*/private static void getDocByAgg(RestHighLevelClient restHighLevelClient) throws IOException {// 1. 创建搜索请求对象SearchRequest request = new SearchRequest("car");// 2.******构建查询请求体******SearchSourceBuilder builder = new SearchSourceBuilder();MaxAggregationBuilder maxAggregationBuilder = AggregationBuilders.max("maxPrice").field("price");builder.aggregation(maxAggregationBuilder);request.source(builder);// 3. 发送请求,接收响应SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);SearchHits hits = response.getHits();// 4. ******解析聚合统计结果******Aggregations aggregations = response.getAggregations();ParsedMax parsedMax = aggregations.get("maxPrice");LOGGER.info("耗时:" + response.getTook());LOGGER.info("是否超时:" + response.isTimedOut());LOGGER.info("总数:" + hits.getTotalHits());LOGGER.info("maxScore:" + hits.getMaxScore());LOGGER.info("统计结果:" + parsedMax.getValueAsString());LOGGER.info("hits =======================>>");for (SearchHit hit : hits) {// 4. 输出数据LOGGER.info(hit.getSourceAsString());}LOGGER.info("<<========================");}
4.3.2.12 分组统计查询—-AggregationBuilders.terms(“分组名称”).field(“分组字段”)
text字段不支持聚合和排序
/*** 13. 分组统计查询(注意:text字段不能做分组)--- AggregationBuilders.terms("分组名称").field("分组字段")** @param restHighLevelClient ES客户端*/private static void getDocByAgg2(RestHighLevelClient restHighLevelClient) throws IOException {// 1. 创建搜索请求对象SearchRequest request = new SearchRequest("car");// 2.******构建查询请求体******SearchSourceBuilder builder = new SearchSourceBuilder();TermsAggregationBuilder termsAggregationBuilder = AggregationBuilders.terms("name_groupby").field("name");builder.aggregation(termsAggregationBuilder);request.source(builder);// 3. 发送请求,接收响应SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);SearchHits hits = response.getHits();// 4. 解析分组统计结果//搜索结果状态信息List<Map> result=new ArrayList<>();Aggregations aggregations = response.getAggregations();Terms terms = aggregations.get("name_groupby");for(Terms.Bucket buck : terms.getBuckets()) {Map map=new HashMap();String[] arr= buck.getKeyAsString().split("#");map.put("module",arr[0].replace("[","").replace("]",""));map.put("user_id",arr[1].replace("[","").replace("]",""));//取子聚合ParsedValueCount averageBalance = buck.getAggregations().get("count");map.put("count",averageBalance.getValue());result.add(map);}LOGGER.info("耗时:" + response.getTook());LOGGER.info("是否超时:" + response.isTimedOut());LOGGER.info("总数:" + hits.getTotalHits());LOGGER.info("maxScore:" + hits.getMaxScore());LOGGER.info("分组统计结果:" + result.toString());LOGGER.info("hits =======================>>");for (SearchHit hit : hits) {// 4. 输出数据LOGGER.info(hit.getSourceAsString());}LOGGER.info("<<========================");}
