环境
官方文档: www.elastic.co/guide/en/el…
版本
ES版本:7.8.1
JDK版本:1.8
Maven 配置
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.8.1</version>
</dependency>
系统配置
yml 配置:
# es cluster
elasticsearch:
hosts: 192.168.0.15:9200,192.168.0.16:9200,192.168.0.17:9200
cluster-name: my-es
username: elastic
password: 1qaz!QAZ
Java配置类:
package com.zjsyinfo.esdemo.config;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.StringUtils;
import java.util.Arrays;
import java.util.Objects;
/**
* ElasticSearch 7.8.1 配置类
* @author hudasen
* @date 2022/05/17
*/
@Slf4j
@Configuration
public class ElasticConfig {
private static final String HTTP_SCHEME = "http";
/**
* 权限验证
*/
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
/**
* es主机
*/
@Value("${elasticsearch.hosts}")
private String[] host;
@Value("${elasticsearch.username}")
private String username;
@Value("${elasticsearch.password}")
private String password;
@Bean
public RestClientBuilder restClientBuilder() {
HttpHost[] hosts = Arrays.stream(host)
.map(this::makeHttpHost)
.filter(Objects::nonNull)
.toArray(HttpHost[]::new);
log.info("host:{}", Arrays.toString(hosts));
//配置权限验证
credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password));
return RestClient.builder(hosts).setHttpClientConfigCallback(httpClientBuilder ->
httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider)
.setMaxConnPerRoute(100)
//最大连接数
.setMaxConnTotal(100)
).setRequestConfigCallback(builder -> {
builder.setConnectTimeout(-1);
builder.setSocketTimeout(60000);
builder.setConnectionRequestTimeout(-1);
return builder;
});
}
/**
* 处理请求地址
* @param address
* @return
*/
private HttpHost makeHttpHost(String address) {
assert StringUtils.hasText(address);
String[] hostAddress = address.split(":");
if (hostAddress.length == 2) {
String ip = hostAddress[0];
Integer port = Integer.valueOf(hostAddress[1]);
return new HttpHost(ip, port, HTTP_SCHEME);
} else {
return null;
}
}
/**
* 配置highLevelClient bean
* @param restClientBuilder
* @return
*/
@Bean(name = "restHighLevelClient")
public RestHighLevelClient restHighLevelClient(@Autowired RestClientBuilder restClientBuilder) {
return new RestHighLevelClient(restClientBuilder);
}
}
各类 API
统计总数
参考 API: www.elastic.co/guide/en/el…
统计一个索引下的所有总数
/**
* 统计一个索引下的所有总数
*/
@Test
void totalAll() throws Exception{
CountRequest countRequest = new CountRequest(indexName);
CountResponse response = highLevelClient.count(countRequest,RequestOptions.DEFAULT);
System.out.println(response.getCount());
}
统计某个条件下的总数
/**
* 统计某个条件下的总数
*/
@Test
void totalTermQuery() throws Exception{
CountRequest countRequest = new CountRequest(indexName);
countRequest.query(QueryBuilders.termsQuery("cardId","320481199004235011"));
CountResponse response = highLevelClient.count(countRequest,RequestOptions.DEFAULT);
System.out.println(response.getCount());
}
统计时间区间下的总数
/**
* 统计时间区间下的总数
*/
@Test
void totalDate() throws Exception{
CountRequest countRequest = new CountRequest(indexName);
RangeQueryBuilder rangeQueryBuilder = new RangeQueryBuilder("createDate");
rangeQueryBuilder.gte("2022-05-26 13:00:00");
rangeQueryBuilder.lte("2022-05-26 16:00:00");
countRequest.query(rangeQueryBuilder);
CountResponse response = highLevelClient.count(countRequest,RequestOptions.DEFAULT);
System.out.println(response.getCount());
}
根据单列进行分组计数
/**
* 根据单列进行分组计数
* count:计数
* sum:求和
*/
@Test
void termsByMonth() throws Exception{
SearchRequest searchRequest = new SearchRequest(indexName);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
// 根据字段 thirdMethod统计 count
TermsAggregationBuilder termsBuilder = AggregationBuilders.terms("count").field("column");
searchSourceBuilder.aggregation(termsBuilder);
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = highLevelClient.search(searchRequest, RequestOptions.DEFAULT);
Terms terms = searchResponse.getAggregations().get("count");
terms.getBuckets().stream().forEach(bucket -> {
System.out.println(bucket.getKeyAsString() + ":" + bucket.getDocCount());
});
}
根据日期/时间进行聚合统计
/**
*
* 根据日期/时间进行聚合统计
*/
@Test
void dateHistogram() throws Exception{
SearchRequest searchRequest = new SearchRequest(indexName);
// 对字段createDate进行dateBucket
DateHistogramAggregationBuilder aggregationBuilder = AggregationBuilders.dateHistogram("dateBucket").field("createDate");
aggregationBuilder.interval(DateHistogramInterval.hours(1).estimateMillis()) //以一小时为间隔
.format("yyyy-MM-dd HH");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.aggregation(aggregationBuilder);
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = highLevelClient.search(searchRequest, RequestOptions.DEFAULT);
Histogram histogram = searchResponse.getAggregations().get("dateBucket");
histogram.getBuckets().stream().forEach(bucket -> {
System.out.println(bucket.getKeyAsString() + "=" + bucket.getDocCount());
});
}