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
查詢的結果如下,
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
可以看到這個索引下有兩個分片,一個主分片一個副本分片,docs列顯示的是文檔數量。
3、總結
ES對文檔的統計根據不同的場景和維度,有不同的方法,在實際項目中根據業務場景選擇適合自己的方式即可。