ElasticSearch日志存储学习:JavaAPI

225 阅读2分钟

环境

官方文档: 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());
    });
}