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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java调用ElasticSearch 7.2.1 保存、统计、多字段分组聚合

發布時間:2023/12/10 java 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java调用ElasticSearch 7.2.1 保存、统计、多字段分组聚合 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

?

maven引用

配置

配置類

保存數據方法

參照官方的引用方式會報錯

分組統計

查詢后再統計

多字段分組聚合

?


maven引用

注意版本與es版本一致

<dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.2.1</version><exclusions><exclusion><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId></exclusion></exclusions> </dependency><dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>7.2.1</version> </dependency>

配置

spring:data:elasticsearch:ip: 10.0.197.198port: 9200scheme: http

配置類

import lombok.Data; import org.apache.http.HttpHost; import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestHighLevelClient; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration;@Configuration @ConfigurationProperties(prefix = "spring.data.elasticsearch") @Data public class ElasticsearchConfig {private String ip;private Integer port;private String scheme;public RestHighLevelClient getClient() {RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost(ip, port, scheme)));return client;} }

保存數據方法

public Boolean setPageAccess(Map map) {try(RestHighLevelClient client= elasticsearchConfig.getClient()) {// 1、創建索引請求IndexRequest indexRequest = new IndexRequest("test"); //文檔idindexRequest.id(StringUtil.getUUID());map.put("time",new Date());// 2、準備文檔數據// 方式一:直接給JSON串String jsonString = JSON.toJSONString(map);indexRequest.source(jsonString, XContentType.JSON);//4、發送請求IndexResponse indexResponse = null;try {// 同步方式indexResponse = client.index(indexRequest, RequestOptions.DEFAULT);} catch (ElasticsearchException e) {// 捕獲,并處理異常//判斷是否版本沖突、create但文檔已存在沖突if (e.status() == RestStatus.CONFLICT) {log.error("沖突了\n" + e.getDetailedMessage());}log.error("索引異常", e);return false;}}catch (Exception e){e.printStackTrace();return false;}return true; }

參照官方的引用方式會報錯

java.lang.NoClassDefFoundError: org/elasticsearch/common/xcontent/DeprecationHandler

解決辦法:排除舊的es引用

<dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.2.1</version><exclusions><exclusion><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId></exclusion></exclusions> </dependency><dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>7.2.1</version> </dependency>

分組統計

注意:分組如果在字符串字段上,需要建立字段對應的.keyword字段,該字段支持聚合處理,直接用字符串字段會報錯。

try(RestHighLevelClient client= elasticsearchConfig.getClient()) {// 1、創建search請求//SearchRequest searchRequest = new SearchRequest();SearchRequest searchRequest = new SearchRequest(INDEX_PAGEACCESS);// 2、用SearchSourceBuilder來構造查詢請求體 ,請仔細查看它的方法,構造各種查詢的方法都在這。SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();//sourceBuilder.query();sourceBuilder.size(0);//加入聚合//字段值項分組聚合TermsAggregationBuilder aggregation = AggregationBuilders.terms("by_method").field("method.keyword").order(BucketOrder.aggregation("count", true));//計算每組的平均balance指標aggregation.subAggregation(AggregationBuilders.count("count").field("_sessionid"));sourceBuilder.aggregation(aggregation);searchRequest.source(sourceBuilder);//3、發送請求SearchResponse searchResponse = client.search(searchRequest,RequestOptions.DEFAULT);//4、處理響應//搜索結果狀態信息if(RestStatus.OK.equals(searchResponse.status())) {// 獲取聚合結果Aggregations aggregations = searchResponse.getAggregations();Terms byAgeAggregation = aggregations.get("by_method");log.info("aggregation by_age 結果");log.info("docCountError: " + byAgeAggregation.getDocCountError());log.info("sumOfOtherDocCounts: " + byAgeAggregation.getSumOfOtherDocCounts());log.info("------------------------------------");for(Terms.Bucket buck : byAgeAggregation.getBuckets()) {log.info("key: " + buck.getKeyAsString());log.info("docCount: " + buck.getDocCount());log.info("docCountError: " + buck.getDocCountError());//取子聚合ParsedValueCount averageBalance = buck.getAggregations().get("count");log.info("average_balance: " + averageBalance.getValue());log.info("------------------------------------");}//直接用key 來去分組/*Bucket elasticBucket = byCompanyAggregation.getBucketByKey("24");Avg averageAge = elasticBucket.getAggregations().get("average_age");double avg = averageAge.getValue();*/}return new ArrayList(); }catch (Exception e){e.printStackTrace();return null; }

查詢后再統計

try(RestHighLevelClient client= elasticsearchConfig.getClient()) {// 1、創建search請求//SearchRequest searchRequest = new SearchRequest();SearchRequest searchRequest = new SearchRequest(INDEX_PAGEACCESS);// 2、用SearchSourceBuilder來構造查詢請求體 ,請仔細查看它的方法,構造各種查詢的方法都在這。SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();//構造QueryBuilderQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("method.keyword", "web_event_srv.upload");sourceBuilder.query(matchQueryBuilder);sourceBuilder.size(0);//加入聚合//字段值項分組聚合TermsAggregationBuilder aggregation = AggregationBuilders.terms("by_fngroup").field("fngroup.keyword").order(BucketOrder.aggregation("count", true));//計算每組的平均balance指標aggregation.subAggregation(AggregationBuilders.count("count").field("sessionid"));sourceBuilder.aggregation(aggregation);searchRequest.source(sourceBuilder);//3、發送請求SearchResponse searchResponse = client.search(searchRequest,RequestOptions.DEFAULT);//4、處理響應//搜索結果狀態信息List<Map> result=new ArrayList<>();if(RestStatus.OK.equals(searchResponse.status())) {// 獲取聚合結果Aggregations aggregations = searchResponse.getAggregations();Terms byAgeAggregation = aggregations.get("by_fngroup");for(Terms.Bucket buck : byAgeAggregation.getBuckets()) {Map map=new HashMap();map.put("name", buck.getKeyAsString());//取子聚合ParsedValueCount averageBalance = buck.getAggregations().get("count");map.put("count",averageBalance.getValue());result.add(map);}}return result; }catch (Exception e){e.printStackTrace();return null; }

?

多字段分組聚合

按fngroup和user_id分組聚合

public List selectModuleCount(Map param) {try(RestHighLevelClient client= elasticsearchConfig.getClient()) {// 1、創建search請求//SearchRequest searchRequest = new SearchRequest();SearchRequest searchRequest = new SearchRequest(INDEX_PAGEACCESS);// 2、用SearchSourceBuilder來構造查詢請求體 ,請仔細查看它的方法,構造各種查詢的方法都在這。SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();sourceBuilder.size(0);//加入聚合//字段值項分組聚合TermsAggregationBuilder aggregation = AggregationBuilders.terms("by_fngroup").script(new Script("doc['fngroup.keyword'] +'#'+doc['user_id']"))//.field("fngroup.keyword").size(Integer.MAX_VALUE).order(BucketOrder.aggregation("count", true));//計算每組的平均balance指標aggregation.subAggregation(AggregationBuilders.count("count").field("sessionid"));sourceBuilder.aggregation(aggregation);searchRequest.source(sourceBuilder);//3、發送請求SearchResponse searchResponse = client.search(searchRequest,RequestOptions.DEFAULT);//4、處理響應//搜索結果狀態信息List<Map> result=new ArrayList<>();if(RestStatus.OK.equals(searchResponse.status())) {// 獲取聚合結果Aggregations aggregations = searchResponse.getAggregations();Terms byAgeAggregation = aggregations.get("by_fngroup");for(Terms.Bucket buck : byAgeAggregation.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);}}return result;}catch (Exception e){e.printStackTrace();return null;}}

?

總結

以上是生活随笔為你收集整理的Java调用ElasticSearch 7.2.1 保存、统计、多字段分组聚合的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。