日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Elasticsearch教程(4) High Level REST Client API 查询 聚合 分组

發(fā)布時間:2024/3/7 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Elasticsearch教程(4) High Level REST Client API 查询 聚合 分组 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

ES High Level REST Client API 查詢 聚合

  • 1 準(zhǔn)備數(shù)據(jù)
    • 1.1 插入測試數(shù)據(jù)
  • 2 Maven引入ES
  • 3 創(chuàng)建Client
  • 4 查詢API
    • 4.1 根據(jù)id查詢單條數(shù)據(jù)
    • 4.2 根據(jù)多個id查詢
    • 4.3 根據(jù)條件分頁查詢
    • 4.4 count
    • 4.5 max
  • 5 terms聚合
    • 5.1 根據(jù)1個字段group by
    • 5.2 根據(jù)多個字段group by

關(guān)于聚合的博客:
Elasticsearch教程(3) ES聚合查詢DSL

Elasticsearch教程(4) High Level REST Client API 查詢 聚合 分組

Elasticsearch教程(5) 指標(biāo)聚合 SQL DSL JavaAPI

Elasticsearch教程(6) 桶聚合Query DSL-Terms Aggregation

Elasticsearch教程(10) ES term terms prefix 搜索 聚合查詢 詳細(xì)總結(jié)

Elasticsearch教程(11) elasticsearch 桶聚合 Query DSL

Elasticsearch教程(32) ES 聚合查詢后過濾 Distinct Group By Having功能

1 準(zhǔn)備數(shù)據(jù)

首先啟動好的ES6.8服務(wù)和Kibana服務(wù)

1.1 插入測試數(shù)據(jù)

假設(shè)有個部門組織的場景,部門有上級部門或者下級部門,像一顆樹那樣

字段注釋
code部門編號
name部門名稱
level層級
path從祖先到自己的id路徑
parentId父部門Id (這里沒有id字段,因為es自帶_id這個字段了)
status狀態(tài)
PUT /dept/_doc/1 {"code": "dept_1","name": "部門1","level": 1,"path": "1","parentId": "","status":1 }PUT /dept/_doc/2 {"code": "dept_2","name": "部門2","level": 1,"path": "2","parentId": "","status":0 }PUT /dept/_doc/3 {"code": "dept_1_1","name": "部門1_1","level": 2,"path": "1,3","parentId": "1","status":0 }PUT /dept/_doc/4 {"code": "dept_1_2","name": "部門1_2","level": 2,"path": "1,4","parentId": "1","status":0 }PUT /dept/_doc/5 {"code": "dept_1_1_1","name": "部門1_1_1","level": 3,"path": "1,3,5","parentId": "3","status":1 }PUT /dept/_doc/6 {"code": "dept_1_1_2","name": "部門1_1_2","level": 3,"path": "1,3,6","parentId": "3","status":null }

數(shù)據(jù)結(jié)果如下:

2 Maven引入ES

新建一個空的Maven結(jié)構(gòu)項目,在pom.xml里添加如下

<dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>6.8.4</version> </dependency>

3 創(chuàng)建Client

public class EsRestUtils {private static RestHighLevelClient client;private static final String type = "_doc";public static RestHighLevelClient getClient() {if (client == null) {client = new RestHighLevelClient(RestClient.builder(new HttpHost("192.168.8.201", 9200, "http")));}return client;} }

4 查詢API

4.1 根據(jù)id查詢單條數(shù)據(jù)

用SQL描述就是

select * from dept where id = '1' protected static Map<String, Object> getById(String index, String id) throws IOException {getClient();GetRequest getRequest = new GetRequest(index, type, id);GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT);if (getResponse.isExists()){return getResponse.getSourceAsMap();}return null; }

4.2 根據(jù)多個id查詢

用SQL描述就是

select * from dept where id in ("1", "2", "3") protected static List<Map<String, Object>> getByIds(String index, List<String> ids) throws IOException {getClient();List<Map<String, Object>> results = new ArrayList<>();MultiGetRequest request = new MultiGetRequest();ids.stream().forEach(id -> {request.add(new MultiGetRequest.Item(index, type, id));});MultiGetResponse response = client.mget(request, RequestOptions.DEFAULT);GetResponse getResponse;for (int i = 0; i < response.getResponses().length; i++) {getResponse = response.getResponses()[i].getResponse();if (getResponse.isExists()) {results.add(getResponse.getSourceAsMap());}}return results; }

4.3 根據(jù)條件分頁查詢

用SQL描述就是

select * from dept where id in ("1", "2", "3") limt 2,10 protected static List<Map<String, Object>> getByWhere(String index, QueryBuilder queryBuilder, int pageNo, int pageSize) throws IOException {getClient();List<Map<String, Object>> results = new ArrayList<>();SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();searchSourceBuilder.query(queryBuilder);searchSourceBuilder.from(pageNo);searchSourceBuilder.size(pageSize);SearchRequest searchRequest = new SearchRequest(index).types(type);searchRequest.source(searchSourceBuilder);SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);SearchHits hits = searchResponse.getHits();SearchHit[] searchHits = hits.getHits();for (SearchHit hit : searchHits) {results.add(hit.getSourceAsMap());}return results; }

4.4 count

用SQL描述就是

select count(1) from dept where name like '部門%' public static long count(QueryBuilder queryBuilder, String... indexs) throws IOException {getClient();SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();searchSourceBuilder.query(queryBuilder);CountRequest countRequest = new CountRequest(indexs);countRequest.source(searchSourceBuilder);CountResponse countResponse = client.count(countRequest, RequestOptions.DEFAULT);long count = countResponse.getCount();return count; }

4.5 max

用SQL描述就是

select max(level) from dept where name like '部門%' public static Double getMax(QueryBuilder queryBuilder, String field, String... indexs) throws IOException {getClient();SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();searchSourceBuilder.query(queryBuilder);searchSourceBuilder.size(0);AggregationBuilder aggregationBuilder = AggregationBuilders.max("agg").field(field);searchSourceBuilder.aggregation(aggregationBuilder);SearchRequest searchRequest = new SearchRequest(indexs).types(type);searchRequest.source(searchSourceBuilder);SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);Max agg = searchResponse.getAggregations().get("agg");return agg.getValue(); }

5 terms聚合

5.1 根據(jù)1個字段group by

用SQL描述就是

select level, count(id) from dept where name like '部門%' group by level public static Map<String, Long> getTermsAgg(QueryBuilder queryBuilder, String field, String... Map<String, Long> groupMap = new HashMap<>();getClient();SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();searchSourceBuilder.query(queryBuilder);searchSourceBuilder.size(0);AggregationBuilder aggregationBuilder = AggregationBuilders.terms("agg").field(field);searchSourceBuilder.aggregation(aggregationBuilder);SearchRequest searchRequest = new SearchRequest(indexs).types(type);searchRequest.source(searchSourceBuilder);SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);Terms terms = searchResponse.getAggregations().get("agg");for (Terms.Bucket entry : terms.getBuckets()) {groupMap.put(entry.getKey().toString(), entry.getDocCount());}return groupMap; }

寫代碼測試

protected static void testGetTermsAgg(String index) {QueryBuilder queryBuilder = QueryBuilders.wildcardQuery("name.keyword", "部門*");try {Map<String, Long> groupMap = EsRestUtils.getTermsAgg(queryBuilder, "level", index);groupMap.forEach((key, value) -> System.out.println(key + " -> " + value.toString()));} catch (IOException e) {e.printStackTrace();} }

運行結(jié)果如下,左邊是level,右邊是個數(shù)

1 -> 2 2 -> 2 3 -> 2

5.2 根據(jù)多個字段group by

用SQL描述就是

select level, status, count(id) from dept where name like '部門%' group by level, status public static Map<String, Map<String, Long>> getTermsAggTwoLevel(QueryBuilder queryBuilder, String field1, String field2, String... indexs) throws IOException {Map<String, Map<String, Long>> groupMap = new HashMap<>();getClient();SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();searchSourceBuilder.query(queryBuilder);searchSourceBuilder.size(0);AggregationBuilder agg1 = AggregationBuilders.terms("agg1").field(field1);AggregationBuilder agg2 = AggregationBuilders.terms("agg2").field(field2);agg1.subAggregation(agg2);searchSourceBuilder.aggregation(agg1);SearchRequest searchRequest = new SearchRequest(indexs).types(type);searchRequest.source(searchSourceBuilder);SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);Terms terms1 = searchResponse.getAggregations().get("agg1");Terms terms2;for (Terms.Bucket bucket1 : terms1.getBuckets()) {terms2 = bucket1.getAggregations().get("agg2");Map<String, Long> map2 = new HashMap<>();for (Terms.Bucket bucket2 : terms2.getBuckets()) {map2.put(bucket2.getKey().toString(), bucket2.getDocCount());}groupMap.put(bucket1.getKey().toString(), map2);}return groupMap; }

寫代碼測試

protected static void testGetTermsAgg2(String index) {QueryBuilder queryBuilder = QueryBuilders.wildcardQuery("name.keyword", "部門*");try {Map<String, Map<String, Long>> groupMap = EsRestUtils.getTermsAggTwoLevel(queryBuilder, "level", "status", index);groupMap.forEach((key, value) -> System.out.println(key + " -> " + value.toString()));} catch (IOException e) {e.printStackTrace();} }

對于id=6的那條數(shù)據(jù),status=null,就不會統(tǒng)計到,如果沒有status也不會統(tǒng)計到。

1 -> {0=1, 1=1}#leve=1的數(shù)據(jù)中,status=11條,status=012 -> {0=2} #leve=2的數(shù)據(jù)中,status=023 -> {1=1} #leve=3的數(shù)據(jù)中,status=11

如果本文對您有幫助,就點個贊👍吧

總結(jié)

以上是生活随笔為你收集整理的Elasticsearch教程(4) High Level REST Client API 查询 聚合 分组的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。