詳解elasticsearch之metric聚合實現示例
更新時間:2023年01月16日 09:09:07 作者:huan1993
這篇文章主要為大家介紹了elasticsearch之metric聚合實現示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
1、背景
此篇文章簡單的記錄一下 elasticsearch
的metric
聚合操作。比如求 平均值、最大值、最小值、求和、總計、去重總計等。
2、準備數據
2.1 準備mapping
PUT /index_person { "settings": { "number_of_shards": 1 }, "mappings": { "properties": { "id":{ "type": "long" }, "name": { "type": "keyword" }, "age": { "type": "integer" }, "class":{ "type": "text", "fielddata": true }, "province":{ "type": "keyword" } } } }
2.2 準備數據
PUT /index_person/_bulk {"index":{"_id":1}} {"id":1, "name":"張三","age":18,"class":"大一班","province":"湖北"} {"index":{"_id":2}} {"id":2, "name":"李四","age":19,"class":"大一班","province":"湖北"} {"index":{"_id":3}} {"id":3, "name":"王武","age":20,"class":"大二班","province":"北京"} {"index":{"_id":4}} {"id":4, "name":"趙六","age":21,"class":"大三班技術班","province":"北京"} {"index":{"_id":5}} {"id":5, "name":"錢七","age":22,"class":"大三班","province":"湖北"}
3、metric聚合
3.1 max 平均值
3.1.1 dsl
POST /index_person/_search { "size": 0, "query": { "match_all": {} }, "aggs": { "agg_01": { "max": { "field": "age", "missing": 10 } } } } POST /index_person/_search { "size": 0, "query": { "match_all": {} }, "aggs": { "agg_01": { "max": { "script": { "lang": "painless", "source": """ doc.age """ } } } } } POST /index_person/_search { "size": 0, "query": { "match_all": {} }, "aggs": { "agg_01": { "max": { "field": "age", "script": { "lang": "painless", "source": """ _value * params.a """, "params": { "a": 2 } } } } } }
3.1.2 java代碼
@Test @DisplayName("最大值聚合") public void test01() throws IOException { SearchRequest request = SearchRequest.of(searchRequest -> searchRequest.index("index_person") .size(0) .aggregations("agg_01", agg -> agg.max(max -> // 聚合的字段 max.field("age") // 如果聚合的文檔缺失這個字段,則給10 .missing(10) ) ) ); System.out.println("request: " + request); SearchResponse<String> response = client.search(request, String.class); System.out.println("response: " + response); } @Test @DisplayName("腳本聚合") public void test02() throws IOException { SearchRequest request = SearchRequest.of(searchRequest -> searchRequest.index("index_person") .size(0) .aggregations("agg_01", agg -> agg.max(max -> max.script(script -> script.inline(inline -> inline.lang(ScriptLanguage.Painless) // 腳本表達式 .source("doc.age") ) ) ) ) ); System.out.println("request: " + request); SearchResponse<String> response = client.search(request, String.class); System.out.println("response: " + response); } @Test @DisplayName("值腳本聚合") public void test03() throws IOException { SearchRequest request = SearchRequest.of(searchRequest -> searchRequest.index("index_person") .size(0) .aggregations("agg_01", agg -> agg.max(max -> // 指定參與聚合的字段 max.field("age") .script(script -> script.inline(inline -> inline.lang(ScriptLanguage.Painless) // 腳本表達式 .source("_value * params.plus") // 參數 .params("plus", JsonData.of(2)) ) ) ) ) ); System.out.println("request: " + request); SearchResponse<String> response = client.search(request, String.class); System.out.println("response: " + response); }
3.2 min最小值
3.2.1 dsl
POST /index_person/_search { "size": 0, "query": { "match_all": {} }, "aggs": { "agg_01": { "min": { "field": "age", "missing": 10 } } } }
3.2.2 java
POST /index_person/_search { "size": 0, "query": { "match_all": {} }, "aggs": { "agg_01": { "min": { "field": "age", "missing": 10 } } } }
3.3 min最小值
3.3.1 dsl
POST /index_person/_search { "size": 0, "query": { "match_all": {} }, "aggs": { "agg_01": { "avg": { "field": "age", "missing": 10 } } } }
3.3.2 java
@Test @DisplayName("平均值聚合") public void test01() throws IOException { SearchRequest request = SearchRequest.of(searchRequest -> searchRequest.index("index_person") .size(0) .aggregations("agg_01", agg -> agg.avg(avg -> // 聚合的字段 avg.field("age") // 如果聚合的文檔缺失這個字段,則給10 .missing(10) ) ) ); System.out.println("request: " + request); SearchResponse<String> response = client.search(request, String.class); System.out.println("response: " + response); }
3.4 min最小值
3.4.1 dsl
POST /index_person/_search { "size": 0, "query": { "match_all": {} }, "aggs": { "agg_01": { "sum": { "field": "age", "missing": 10 } } } }
3.4.2 java
@Test @DisplayName("求和聚合") public void test01() throws IOException { SearchRequest request = SearchRequest.of(searchRequest -> searchRequest.index("index_person") .size(0) .aggregations("agg_01", agg -> agg.sum(sum -> // 聚合的字段 sum.field("age") // 如果聚合的文檔缺失這個字段,則給10 .missing(10) ) ) ); System.out.println("request: " + request); SearchResponse<String> response = client.search(request, String.class); System.out.println("response: " + response); }
3.5 count(*)
3.5.1 dsl
POST /index_person/_search { "size": 0, "query": { "match_all": {} }, "aggs": { "agg_01": { "value_count": { "field": "province", "missing": 10 } } } }
3.5.2 java
@Test @DisplayName("count(*)聚合") public void test01() throws IOException { SearchRequest request = SearchRequest.of(searchRequest -> searchRequest.index("index_person") .size(0) .aggregations("agg_01", agg -> agg.valueCount(valueCount -> // 聚合的字段 valueCount.field("age") // 如果聚合的文檔缺失這個字段,則給10 .missing(10) ) ) ); System.out.println("request: " + request); SearchResponse<String> response = client.search(request, String.class); System.out.println("response: " + response); }
3.6 count(distinct)
3.6.1 dsl
POST /index_person/_search { "size": 0, "query": { "match_all": {} }, "aggs": { "agg_01": { "cardinality": { "field": "province", "missing": 10 } } } }
3.6.2 java
@Test @DisplayName("count(distinct)聚合") public void test01() throws IOException { SearchRequest request = SearchRequest.of(searchRequest -> searchRequest.index("index_person") .size(0) .aggregations("agg_01", agg -> agg.cardinality(cardinality -> // 聚合的字段 cardinality.field("province") // 如果聚合的文檔缺失這個字段,則給10 .missing(10) ) ) ); System.out.println("request: " + request); SearchResponse<String> response = client.search(request, String.class); System.out.println("response: " + response); }
3.7 stat (max,min,avg,count,sum)
3.7.1 dsl
POST /index_person/_search { "size": 0, "query": { "match_all": {} }, "aggs": { "agg_01": { "stats": { "field": "avg", "missing": 10 } } } }
3.7.2 java
@Test @DisplayName("stat聚合") public void test01() throws IOException { SearchRequest request = SearchRequest.of(searchRequest -> searchRequest.index("index_person") .size(0) .aggregations("agg_01", agg -> agg.stats(stats -> // 聚合的字段 stats.field("age") // 如果聚合的文檔缺失這個字段,則給10 .missing(10) ) ) ); System.out.println("request: " + request); SearchResponse<String> response = client.search(request, String.class); System.out.println("response: " + response); }
3.8 聚合后返回每個聚合涉及的文檔
3.8.1 需求
根據 province
進行terms
聚合,然后獲取每個terms
聚合 age
最大的那個文檔。
3.8.2 dsl
POST /index_person/_search { "size": 0, "query": { "range": { "age": { "gte": 10 } } }, "aggs": { "agg_01": { "terms": { "field": "province" }, "aggs": { "agg_02": { "top_hits": { "from": 0, "size": 1, "sort": [ { "age": {"order": "desc"} } ], "_source": { "includes": ["id","age","name"] } } } } } } }
3.8.3 java
@Test @DisplayName("top hits 聚合") public void test01() throws IOException { SearchRequest request = SearchRequest.of(searchRequest -> searchRequest.index("index_person") .size(0) .query(query -> query.range(range -> range.field("age").gt(JsonData.of(10)))) .aggregations("agg_01", agg -> agg.terms(terms -> terms.field("province") ) .aggregations("agg_02", subAgg -> subAgg.topHits(topHits -> topHits.from(0) .size(1) .sort(sort -> sort.field(field -> field.field("age").order(SortOrder.Desc))) .source(source -> source.filter(filter -> filter.includes(Arrays.asList("id", "age", "name")))) ) ) ) ); System.out.println("request: " + request); SearchResponse<String> response = client.search(request, String.class); System.out.println("response: " + response); }
3.8.4 運行結果
完整代碼
參考文檔
以上就是詳解elasticsearch之metric聚合實現示例的詳細內容,更多關于elasticsearch metric聚合的資料請關注腳本之家其它相關文章!
相關文章
springboot cloud使用eureka整合分布式事務組件Seata 的方法
這篇文章主要介紹了springboot cloud使用eureka整合分布式事務組件Seata 的方法 ,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-05-05使用ThreadPoolExecutor之高效處理并發(fā)任務
這篇文章主要介紹了使用ThreadPoolExecutor之高效處理并發(fā)任務,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07一文搞懂spring boot本地事務@Transactional參數
這篇文章主要介紹了spring boot本地事務@Transactional參數詳解,本文通過示例代碼圖文相結合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-10-10