ES系列之原來查看文檔數量有這麼多姿勢

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嵌套文檔,關於嵌套文檔可以看看這篇文章,這裏不詳述了。

ES系列之嵌套文檔和父子文檔

新建一個索引,然後插入一個文檔。

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對文檔的統計根據不同的場景和維度,有不同的方法,在實際項目中根據業務場景選擇適合自己的方式即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章