博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ElasticSearch中Index判断与数量和分组处理
阅读量:2055 次
发布时间:2019-04-28

本文共 4767 字,大约阅读时间需要 15 分钟。

文章目录

在《》中,介绍了简单查询的方法,下面介绍一些其他操作。

获取数量count

在ES查询时,SearchResponse中的SearchHits中包含有满足条件的记录数量;为了减少数据量的传递,查询时需要设定size为0,避免返回记录的详细信息,浪费时间与流量。

public long count(List
lstIndex, QueryBuilder queryBuilder) {
try (RestHighLevelClient client = getClient()) {
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); sourceBuilder.query(queryBuilder); // sourceBuilder.from(0); sourceBuilder.size(0); sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS)); SearchRequest reqSearch = new SearchRequest(lstIndex.toArray(new String[0])); reqSearch.source(sourceBuilder); SearchResponse respSearch = client.search(reqSearch); SearchHits hitsSearch = respSearch.getHits(); return hitsSearch.getTotalHits(); } catch (ElasticsearchStatusException ex) {
_logger.error("Count fail: {}", ex); }}

判断Index是否存在

ES7与ES6下判断的方式是不同的。

ES7中判断Index

在ES7下,可以方便地通过客户端连接的indices().exists来判断:

static boolean isIndexExists(String strIndex) {
try (RestHighLevelClient client = getRestHighLevelClient()) {
GetIndexRequest req = new GetIndexRequest(strIndex); boolean resp = client.indices().exists(req, RequestOptions.DEFAULT); System.out.println(strIndex + " exists: " + resp); return resp; } catch (Exception ex) {
ex.printStackTrace(); } return false;}

ES6中判断Index

ES6中无法使用上面的判断方法,只好通过BBossESStarter中的方法来实现。在yml中设定好ES相关配置后,即可通过@Autowired注解自动创建。

@AutowiredBBossESStarter bossStarter;public boolean isIndexExists(String strIndex) {
ClientInterface client = bossStarter.getRestClient(); return client.existIndice(strIndex);}

为了使用BBossESStarter,需要在pom中增加如下包:

com.bbossgroups.plugins
bboss-elasticsearch-rest-jdbc
6.1.2
slf4j-log4j12
org.slf4j
com.bbossgroups.plugins
bboss-elasticsearch-spring-boot-starter
6.1.2
slf4j-log4j12
org.slf4j

在yml文件中增加如下配置:

spring:  elasticsearch:    bboss:#      elasticUser: elastic#      elasticPassword: changeme      elasticsearch:        rest:          hostNames: 127.0.0.1:9200          ##hostNames: 192.168.8.25:9200,192.168.8.26:9200,192.168.8.27:9200  ##集群地址配置        dateFormat: yyyy.MM.dd        timeZone: Asia/Shanghai        showTemplate: true        discoverHost: false      dslfile:        refreshInterval: -1      http:        timeoutConnection: 5000        timeoutSocket: 5000        connectionRequestTimeout: 5000        retryTime: 1        maxLineLength: -1        maxHeaderCount: 200        maxTotal: 400        defaultMaxPerRoute: 200        soReuseAddress: false        soKeepAlive: false        timeToLive: 3600000        keepAlive: 3600000        keystore:        keyPassword:        hostnameVerifier:

聚合(分组)查询

聚合提供了用户进行分组和数理统计的能力,可以把聚合理解成SQL中的GROUP BY和分组函数。

通过AggregationBuilder可以设定分组信息,分组结果在bucket中:

  • 指标聚合:max/min/avg/sum/stats,获取分组中最大、最小、平均、和、统计值;
  • terms聚合:根据字段值项分组聚合;field按什么字段分组;size指定返回多少个分组;
  • date_histogram聚合:时间直方图聚合(按天、月、年等进行聚合统计)可按 year (1y), quarter (1q), month (1M), week (1w), day (1d), hour (1h), minute (1m), second (1s) 间隔聚合或指定的时间间隔聚合;
static void groupTest() {
try (RestHighLevelClient client = getRestHighLevelClient()) {
List
lstIndex = new ArrayList<>(); lstIndex.add("stats-2020.11.03"); SearchRequest searchRequest = new SearchRequest(lstIndex.toArray(new String[0])); SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); sourceBuilder.size(0); // AggregationBuilder agg = AggregationBuilders.sum("groups").field("count"); // AggregationBuilder agg = AggregationBuilders.terms("groups").field("count").size(100); AggregationBuilder agg = AggregationBuilders.dateHistogram("groups") .field("addDate") .fixedInterval(DateHistogramInterval.MINUTE) .minDocCount(1) .order(BucketOrder.count(true)); sourceBuilder.aggregation(agg); searchRequest.source(sourceBuilder); SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); MultiBucketsAggregation termNum = searchResponse.getAggregations().get("groups"); System.out.println("Agg Terms: " + termNum.getBuckets().size()); for (MultiBucketsAggregation.Bucket entry : termNum.getBuckets()) {
System.out.println("Agg: " + entry.getKeyAsString() + " - " + entry.getDocCount()); } } catch (Exception ex) {
ex.printStackTrace(); }}

转载地址:http://lwilf.baihongyu.com/

你可能感兴趣的文章
Openshift 4.4 静态 IP 离线安装系列(一):准备离线资源
查看>>
万字长文,说透了 Openshift4 的安装过程!
查看>>
Envoy 中文指南系列:Envoy 介绍
查看>>
[译] BeyondProd:云原生安全的一种新方法(Google, 2019)
查看>>
什么?VMware Fusion 也能 docker run 了?
查看>>
教你玩转微服务的装逼指南!
查看>>
Envoy 中文指南系列:Sidecar 模式
查看>>
面试官邪魅一笑:你猜一个 TCP 重置报文的序列号是多少?
查看>>
Envoy 中文指南系列: 安装
查看>>
最华丽的 Kubernetes 桌面客户端:Lens
查看>>
太赞了,这个神器竟然能分分钟将多个 kubeconfig 合并成一个!
查看>>
如何解决容器中 nginx worker process 自动设置的问题
查看>>
ethtool 原理介绍和解决网卡丢包排查思路
查看>>
HPE 推出容器平台 Ezmeral,向 VMware 与 Red Hat 下战书
查看>>
使用 Prometheus-Operator 监控 Calico
查看>>
如果你不习惯新版的 Github 的 UI 界面,可以试试这款插件
查看>>
容器化囧途——没上容器时好好的?
查看>>
linux内核网络参数tcp_tw_recycle 和 tcp_tw_reuse 你搞清楚了吗?
查看>>
40核CPU+80G内存的云资源终终终终终于免费了!
查看>>
Drone开源持续集成工具——Pipeline篇
查看>>