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;}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/416871.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

cocos2d-x 2.2 创建项目

楼主用的是2.2版本号 曾经的版本号是要在vs中加入模版 建立项目 但新版本号更新后使用python建立项目 最好是python2.7以上 找到create_project.py文件所在路径 tools/project-creator/.. 打开cmd.exe 输入 cd /d D:cocosdx/....... 后面为create_project.py所在的路径…

Postgresql时间处理

目录 时间/日期操作符 日期/时间函数 EXTRACT函数 综合示例 时间/日期操作符 操作符例子结果date 2011-09-28 integer 7date 2011-10-05date 2011-09-18 interval 1 hourtimestamp 2011-09-18 01:00date 2011-09-18 time 02:00timestamp 2011-09-18 02:00interval 1 day…

jmap报错unknown CollectedHeap type : class sun.jvm.hotspot.gc_interface.CollectedHeap

jmap报错 [roothost-10-0-197-189 service]# jmap -heap 12139 Attaching to process ID 12139, please wait... Debugger attached successfully. Server compiler detected. JVM version is 25.191-b12using thread-local object allocation. Parallel GC with 8 thread(s)H…

topcoder SRM712 Div1 LR

题目&#xff1a; Problem Statement We have a cyclic array A of length n. For each valid i, element i-1 the left neighbor of element i. Additionally, element n-1 is the left neighbor of element 0. You are given two vector<long long>s s and t, each…

Spring Boot Quartz应用

目录 简单用法 配置cronSchedule的写法 简单用法 直接EnableScheduling后&#xff0c;方法上加上Scheduled(cron "0 */1 * * * * ")就行了。 此种方式需要写死时间、写死实现&#xff0c;生产环境不方便配置控制。 EnableScheduling SpringBootApplication publi…

2491 玉蟾宫

2491 玉蟾宫 时间限制: 1 s 空间限制: 64000 KB 题目等级 : 大师 Master 题目描述 Description有一天&#xff0c;小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫&#xff0c;玉蟾宫宫主蓝兔盛情地款待了它们&#xff0c;并赐予它们一片土地。 这片土地被分成N*M个格子&am…

linux根目录空间占满问题排查

df -h 看到/目录已满 切换到根目录后看各个目录空间占用 cd / du -h -x --max-depth1 [rootlocalhost usr]# du -h -x --max-depth160M ./bin42M ./sbin460M ./lib207M ./lib64204M ./share0 ./etc0 ./games36K ./include12M ./libexec0 ./local0 ./src983M . 依次找到过大…

hihocoder 1183 割点和割边

链接&#xff1a; http://hihocoder.com/problemset/problem/1183 代码&#xff1a; 1 #include <map>2 #include <set>3 #include <cmath>4 #include <queue>5 #include <stack>6 #include <cstdio>7 #include <string>8 #include …

ubuntu navicat删除目录破解如何保留配置信息

配置信息存储位置&#xff1a; ~/.navicat64/user.reg 这个文件跟windows注册表导出的文件一样 下面分析配置中对我们有用的信息 字体设置&#xff1a; [Software\\PremiumSoft\\NavicatPremium] 1566266955 #time1d556fc440497e6 "AlreadyShowNavicateV121WelcomeS…

前端学习(2398):回顾

# 一、项目初始化## 使用 Vue CLI 创建项目> 注意&#xff1a;不要使用 Git Bash 执行项目创建操作&#xff0c;使用 cmd 或者 powershell 之类的工具。> 如果你还没有安装 VueCLI&#xff0c;或者版本低于 4&#xff0c;请执行下面的命令安装或是升级&#xff1a; >…

ubuntu经常提示:检测到系统程序出现问题

sudo vi /etc/default/apport 修改值 enabled0

前端学习(2399):关于编辑代码编辑器

代码段使用 可以对对应的编辑器去设置代码段

React Native 一些事

ReactJS 是否准备好 有时候我们常常需要监听 ReactJS 的的加载情况。 比如说&#xff0c;当获取一条推送&#xff0c;应用还没有起来&#xff0c;通过点击推送启动应用后&#xff0c;而推送中包含一些我们感兴趣的字段需要处理&#xff0c;我们如果直接把这条通知发送给 ReactJ…

ubuntu下 windows的zip文件打开,中文目录和文件名乱码

sudo apt-get install unar lsar xxx.zip 查看压缩文件内文件名 unar xxx.zip 解压文件 原因&#xff1a;windows下面文件名是GBK编码的&#xff0c;与linux不同。

前端学习(2411):name属性的作用

先纠正一下&#xff0c;这个问题的标题和内容不是一个问题&#xff0c;这里应该是涉及到两个知识点&#xff1a; 组件的 name路由的 name 下面我分别解释一下。 组件的 name 参考链接&#xff1a;https://router.vuejs.org/zh/guide/essentials/named-routes.html 组件的 nam…

HDU 1231 最大连续子序列

http://acm.hdu.edu.cn/showproblem.php?pid1231 Dp[i] 以a[i]元素结尾的子序列的最大和 记录 再记录一下起始位置即可 1 #include <iostream>2 #include <string.h>3 #include <stdio.h>4 using namespace std;5 6 int a[10007];7 int dp[10007];8 int st[…

Servlet生命周期与工作原理

http://www.cnblogs.com/cuiliang/archive/2011/10/21/2220671.html Servlet生命周期分为三个阶段&#xff1a; 1&#xff0c;初始化阶段 调用init()方法 2&#xff0c;响应客户请求阶段  调用service()方法 3&#xff0c;终止阶段  调用destroy()方法 Servlet初始化阶段&…

linux(ubuntu)给vmware中的windows虚拟机共享磁盘

设置vm——options——shared folders&#xff1a; 注意&#xff1a;共享的磁盘不能进行目录监听&#xff0c;比如微信小程序开发工具就无法打开这里面的项目。

javase模拟斗地主洗牌和发牌(54)

1、使用Arraylist集合: 1 package com.it18zhang.day08;2 3 import java.util.ArrayList;4 import java.util.Collections;5 6 public class PokerDemo {7 8 public static void main(String[] args) {9 // TODO Auto-generated method stub 10 //牌合 11 …

sudo apt update提示某个源超时

sudo apt update提示某个源超时 进入软件更新器&#xff0c;设置&#xff0c;选择其他软件&#xff0c;删除超时的连接。