java 区间api_ES22-JAVA API 桶聚合

1.分组统计

/**

* 分组统计

*/

public static void termsAgg() {

//分组统计每个年龄有多少人

AggregationBuilder aggregation = AggregationBuilders.terms("terms").field("age");

SearchResponse response = getClient().prepareSearch("my_person").addAggregation(aggregation).execute()

.actionGet();

Terms terms = response.getAggregations().get("terms");

for (Terms.Bucket bucket : terms.getBuckets()) {

System.out.println(bucket.getKey() + ":" + bucket.getDocCount());

}

}

测试:

public static void main(String[] args) {

termsAgg();

}

执行结果:

20:3

22:1

23:1

28:1

2.过滤统计

/**

* 过滤分组

*/

public static void filterAgg() {

//过滤条件

QueryBuilder query = QueryBuilders.termQuery("age", 20);

//通过过滤条件进行分组

AggregationBuilder aggregation = AggregationBuilders.filter("filter", query);

SearchResponse response = getClient().prepareSearch("my_person").addAggregation(aggregation).execute()

.actionGet();

System.out.println(response.getAggregations().get("filter").toString());

}

测试

public static void main(String[] args) {

filterAgg();

}

执行结果:

{"filter":{"doc_count":3}}

3.多个过滤条件统计

/**

* 多个过滤条件统计

*/

public static void filtersAgg() {

//多个过滤条件分组统计(每个过滤条件单独统计,互补影响)

AggregationBuilder aggregation = AggregationBuilders.filters("filters",

new FiltersAggregator.KeyedFilter("ageAgg", QueryBuilders.termQuery("age", 20)),//年龄20的文档个数

new FiltersAggregator.KeyedFilter("salaryAgg", QueryBuilders.termQuery("salary", 6000)));//薪资6000的文档个数

SearchResponse response = getClient().prepareSearch("my_person").addAggregation(aggregation).execute()

.actionGet();

Filters filters = response.getAggregations().get("filters");

for (Filters.Bucket bucket : filters.getBuckets()) {

System.out.println(bucket.getKeyAsString()+"="+bucket.getDocCount());

}

}

测试

public static void main(String[] args) {

filtersAgg();

}

执行结果,在所有文档中“age”为“20”的文档个数是3,“salary”为 "6000"的文档个数是1

ageAgg=3

salaryAgg=1

4.区间聚合

包含前边界,不包含后边界

/**

* 范围统计

*/

public static void rangeAgg() {

AggregationBuilder aggregation = AggregationBuilders.range("rangeAgg")

.field("age")

.addUnboundedTo(22)//从无穷小到22(不包含22)

.addRange(22, 28)//22到28(包含22不包含28)

.addUnboundedFrom(28);//从28开始到无穷大(包含28)

SearchResponse response = getClient().prepareSearch("my_person").addAggregation(aggregation).execute().actionGet();

Range range = response.getAggregations().get("rangeAgg");

for (Range.Bucket bucket : range.getBuckets()) {

System.out.println(bucket.getKey()+"="+bucket.getDocCount());

}

}

测试,文档数据中年龄分布:20,20,20,22,23,28

public static void main(String[] args) {

rangeAgg();

}

执行结果

*-22.0=3

22.0-28.0=2

28.0-*=1

5.日期区间聚合

包含前边界,不包含后边界

/**

* 日期范围统计

*/

public static void dateRangeAgg() {

AggregationBuilder aggregation = AggregationBuilders.dateRange("dateAgg")

.field("pubdate")

.format("yyyy-MM-dd'T'HH:mm:ss")

.addUnboundedTo("2018-07-17T12:33:11")// 从无穷小到2018-07-17T12:33:11(不包含)

.addUnboundedFrom("2018-07-17T14:14:55");// 从2018-07-17T17:16:30到无穷大(包含)

SearchResponse response = getClient().prepareSearch("telegraph").addAggregation(aggregation).execute()

.actionGet();

Range range = response.getAggregations().get("dateAgg");

for (Range.Bucket bucket : range.getBuckets()) {

System.out.println(bucket.getKey()+"="+bucket.getDocCount());

}

}

测试

public static void main(String[] args) {

dateRangeAgg();

}

结果

*-2018-07-17T12:33:11=0

2018-07-17T14:14:55-*=3

6.missing聚合

/**

* 统计字段为空文档数量

*/

public static void missingAgg() {

//统计pubdate为空文档数量

AggregationBuilder aggregation = AggregationBuilders.missing("missingAgg").field("pubdate");

SearchResponse response = getClient().prepareSearch("telegraph").addAggregation(aggregation).execute()

.actionGet();

Missing missing = response.getAggregations().get("missingAgg");

System.out.println(missing.getDocCount());

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,您的问题是如何使用 Java API 获取 Elasticsearch 中的总数。 您可以使用 Elasticsearch Java API 中的 `SearchRequest` 和 `SearchResponse` 来实现。具体实现步骤如下: 1. 创建一个 `SearchRequest` 对象,并设置需要查询的 index。 ```java SearchRequest searchRequest = new SearchRequest("your_index_name"); ``` 2. 创建一个 `SearchSourceBuilder` 对象,并设置需要查询的条件。这里我们只需要查询总数,所以只需要设置一个 `size` 为 0 的参数即可。 ```java SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.size(0); ``` 3. 将 `SearchSourceBuilder` 对象设置到 `SearchRequest` 中。 ```java searchRequest.source(searchSourceBuilder); ``` 4. 执行查询,并获取查询结果中的总数。 ```java SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT); long totalHits = searchResponse.getHits().getTotalHits().value; ``` 注意:在执行查询之前,需要先创建一个 `RestHighLevelClient` 对象,并设置好连接 Elasticsearch 的参数。 完整的 Java 代码示例: ```java RestHighLevelClient restHighLevelClient = new RestHighLevelClient( RestClient.builder(new HttpHost("localhost", 9200, "http"))); SearchRequest searchRequest = new SearchRequest("your_index_name"); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.size(0); searchRequest.source(searchSourceBuilder); SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT); long totalHits = searchResponse.getHits().getTotalHits().value; restHighLevelClient.close(); ``` 希望这个回答能够帮助到您。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值