ElasticSearch简单入门和SpringBoot集成

背景

项目中使用第三方网关系统,该网关使用ElasticSearch进行服务访问日志记录。
为充分利用该网关功能,并在数据基础上实现计数、计费功能,需对ElasticSearch进行快速学习,并使用Java代码集成,从而实现项目所需要的运营功能。

ElasticSearch基础知识学习

为快速建立起对ES印象,可按下表进行概念映射:


关系型数据库与ES比较

Kibana搭建

为对ES中数据可视化,在服务器上进行Kibana搭建。

1、下载指定压缩包

地址: https://www.elastic.co/cn/downloads/kibana
传至服务器上,解压即可。注意要与ES版本相对应。
kibana-6.8.23-linux-x86_64.tar.gz

# 解压缩
tar -zxvf kibana-6.8.23-linux-x86_64.tar.gz
# 进入配置文件,进行配置的编写
vi /config/kibana.yml

2、修改配置并启动

编辑配置文件如下:

# 指定ElasticSearch实例地址
elasticsearch.hosts: ["http://localhost:9200"]
# 指定允许访问服务地址,规定为0.0.0.0,为允许所有ip访问
server.host: "0.0.0.0"
 # 指定es的用户名
elasticsearch.username: "username"
 # 指定es的密码
elasticsearch.password: "password"
# 指定kibana的语言为中文
i18n.locale: "zh-CN"

进入bin目录并启动:

nohup ./kibana &
tailf -n nohup.out

访问ip:5601端口即可打开页面访问:

kibana首页

3、页面设置索引规则

管理页面-设置索引模式

使用索引模式,建立通配索引后,可以在discover tab下查看到内容。

4、使用开发工具,进行查询语句调试

对于需要调试的DSL语句,可以使用开发工具进行请求的调试。

SpringBoot集成

客户端集成(带账号、密码)

1、将密码、地址等配到SpringBoot项目的配置文件中;
2、重写restHighLevelClient
代码清单如下:

@Configuration
@Log4j2
public class ElasticSearchConfiguration {


    @Value("${elasticsearch.host}")
    private String elasticSearchHost;

    @Value("${elasticsearch.port}")
    private String elasticSearchPort;

    @Value("${elasticsearch.username}")
    private String elasticSearchUser;

    @Value("${elasticsearch.password}")
    private String elasticSearchPass;

    @Bean(name = "restHighLevelClient")
    public RestHighLevelClient restHighLevelClient() {
        List hostLists = new ArrayList<>();
        hostLists.add(new HttpHost(elasticSearchHost, Integer.parseInt(elasticSearchPort), "http"));
        final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
        credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(elasticSearchUser, elasticSearchPass));

        // 转换成 HttpHost 数组
        HttpHost[] httpHost = hostLists.toArray(new HttpHost[]{});
        // 构建连接对象
        RestClientBuilder builder = RestClient.builder(httpHost);
        // 异步连接延时配置
        builder.setRequestConfigCallback(requestConfigBuilder -> {
            requestConfigBuilder.setConnectTimeout(5000);
            requestConfigBuilder.setSocketTimeout(5000);
            requestConfigBuilder.setConnectionRequestTimeout(5000);
            return requestConfigBuilder;
        });
        // 异步连接数配置
        builder.setHttpClientConfigCallback(httpClientBuilder -> {
            httpClientBuilder.setMaxConnTotal(100);
            httpClientBuilder.setMaxConnPerRoute(100);
            return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
        });
        return new RestHighLevelClient(builder);
    }
}

聚合查询示例

业务需求:
1、按照查询条件,查询某服务的访问次数
2、查询该服务的请求体总长度,用于计量计费
给出单元测试代码:

    @Resource
    RestHighLevelClient client;
    @Test
    public void testQuery() {
        SearchRequest searchRequest = new SearchRequest("sg-access-*");
//构建查询
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();

        //按时间聚合,求TX的和
        BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery().must(QueryBuilders.matchPhraseQuery("paasid", "111"))
                .must(QueryBuilders.matchQuery("srvid", "111"));

        AggregationBuilder aggregation = AggregationBuilders.filter("term", queryBuilder);
        aggregation.subAggregation(AggregationBuilders.sum("reqLengthSum").field("reqLength"));

        sourceBuilder.aggregation(aggregation);


        searchRequest.source(sourceBuilder);
        //发送请求
        SearchResponse searchResponse = null;
        try {
            searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
            Aggregations aggFilter = searchResponse.getAggregations();
            if (aggFilter != null && aggFilter.get("term") != null) {
                ParsedFilter parsedFilter = aggFilter.get("term");
                System.out.println("查询出请求的次数:" + parsedFilter.getDocCount());
                ParsedSum sum = (ParsedSum) parsedFilter.getAggregations().getAsMap().get("reqLengthSum");
                System.out.println("请求体的总大小 :" +  sum.getValue());
            }

        } catch (IOException e) {
            System.out.println(searchResponse);
        }
    }

运行结果如下:


运行结果

可以看出,我们可以通过Java代码,对ES的数据进行条件查询,并对索引进行通配匹配查询,并使用聚合方法进行聚合运算。

你可能感兴趣的:(ElasticSearch简单入门和SpringBoot集成)