es java api 获取总数_ES系列之原来查看文档数量有这么多姿势

本文详细介绍了使用ES Java API获取文档总数的多种方法,包括cat count API、cat indices、search API以及聚合函数。通过实例展示了它们在不同情况下的应用,如考虑嵌套文档和分片统计,帮助理解各种方法的效率和适用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、引言

有人可能觉得,查看文档数量不是很简单吗?直接

GET /_cat/count/index_name?v

不就可以了吗。

事实上远不止这么简单,比如嵌套文档的情况等。相信你看了我这篇文章之后你会感叹原来统计文档有这么多讲究啊。

2、正文

cat/count

首先是最常用的的方式,也是一种快速查询文档的优先推荐方式,cat count api我们使用kibana自带的电商索引来实验。

GET _cat/count/kibana_sample_data_ecommerce?v

返回,

epoch timestamp count

1585910697 10:44:57 4675

cat count api的方式能够快速的返回某个索引下文档的数量,需要注意的是已经删除的文档即使还没有物理删除(merge)也不会统计。我们可以来做个实验,任意删除一个文档,然后再次查询下。

DELETE kibana_sample_data_ecommerce/_doc/VJz1f28BdseAsPClo7bC

再次查询发现少了一条。

另外,使用cat count api我们也可以不指定索引,从而查询整个集群的文档数量。

GET _cat/count?v

GET _cat/indices

整个命令其实主要是用来查询索引相关的信息的,而这些信息里面包含文档的数量。 比如,

GET _cat/indices/kibana_sample_data_ecommerce?v

查询的结果如下,

93a3f9518afdcf73431469512a27053f.png

docs.count列就是文档的数量。

和cat count api不同的是,cat indices命令统计的文档数量是底层所有的文档数量,如果你不太明天,我举个例子。

我们新增一个测试的索引,使用nested嵌套文档,关于嵌套文档可以看看这篇文章,这里不详述了。

新建一个索引,然后插入一个文档。

PUT my_index

{

"mappings": {

"properties": {

"user": {

"type": "nested"

}

}

}

}

PUT my_index/_doc/1

{

"group" : "fans",

"user" : [

{

"first" : "John",

"last" : "Smith"

},

{

"first" : "Alice",

"last" : "White"

}

]

}

我们先用cat count api查询下,结果是1,然后用cat indices查询,发现结果是3。这是为什么呢?

这是因为cat indices是直接从lucene获取的这些信息,而我们之前的文章讲过nested类型的属性其实在lucene内部是独立的文档,只不过在ES这一层隐藏了这些细节。

使用search api

我们当然可以直接使用search去统计文档数量,只要不指定查询条件,然后查询结果中的total就是文档的总数量。

GET kibana_sample_data_ecommerce/_search

{

"query": {

"match_all": {}

}

}

结果是(只显示部分),

"hits" : {

"total" : {

"value" : 4673,

"relation" : "eq"

},

"max_score" : 1.0,

"hits" : [

{

不过search api有个问题,这个total最大只会显示10000个,这个我就不举例子了。

这里我们可以进一步探讨一个问题,cat count api和search方式统计文档哪个效率高?我没有找到官方文档,不过大概也能推断出前者应该是更快一些,因为查询还要算分,排名这些操作,应该更耗时。

利用聚合统计文档

我们还可以利用ES的聚合函数统计文档数量,如下:

GET /kibana_sample_data_ecommerce/_search

{

"size" : 0,

"aggs" : {

"my_count" : {

"value_count": {

"field" : "_id"

}

}

}

}

结果是,

{

"took" : 24,

"timed_out" : false,

"_shards" : {

"total" : 1,

"successful" : 1,

"skipped" : 0,

"failed" : 0

},

"hits" : {

"total" : {

"value" : 4672,

"relation" : "eq"

},

"max_score" : null,

"hits" : [ ]

},

"aggregations" : {

"my_count" : {

"value" : 4672

}

}

}

我们这里用了Value Count Aggregation 按字段统计文档数量。

查看分片上的文档数量

有时候我们需要查看一个分片上文档数量,使用cat shards api可以做到。

GET _cat/shards/kibana_sample_data_ecommerce?v

67eef2de6129521c8301d1cfcc6708d9.png

可以看到这个索引下有两个分片,一个主分片一个副本分片,docs列显示的是文档数量。

3、总结

ES对文档的统计根据不同的场景和维度,有不同的方法,在实际项目中根据业务场景选择适合自己的方式即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值