目录
maven引用
配置
配置类
保存数据方法
参照官方的引用方式会报错
分组统计
查询后再统计
多字段分组聚合
注意版本与es版本一致
org.elasticsearch.client
elasticsearch-rest-high-level-client
7.2.1
org.elasticsearch
elasticsearch
org.elasticsearch
elasticsearch
7.2.1
spring:
data:
elasticsearch:
ip: 10.0.197.198
port: 9200
scheme: 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"); //文档id
indexRequest.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引用
org.elasticsearch.client
elasticsearch-rest-high-level-client
7.2.1
org.elasticsearch
elasticsearch
org.elasticsearch
elasticsearch
7.2.1
注意:分组如果在字符串字段上,需要建立字段对应的.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();
//构造QueryBuilder
QueryBuilder 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
按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