1、首先必需要掌握如下4個數據結構的基本概念。node
一、索引(index)數據庫
咱們已經有了關係型數據庫的基礎,如今能夠用類比理解。elasticsearch的索引,你就能夠理解爲是一張表。記住這裏的‘索引’是名詞。後續咱們操做的時候,好比咱們把一條數據索引發來,就是指動詞。json
二、文檔(document)服務器
一樣用類比理解,文檔是傳統關係型數據表中的一條記錄。也就是elasticsearch存儲的主要實體。數據結構
三、文檔類型app
就是指這條記錄,也即這個文檔是什麼類型的。好比 User類型、Order類型。這裏的類型是指業務類型。畢竟你存的都是業務上面的數據實體。同一個索引裏面能夠包含不一樣的文檔類型,好比下面這裏的post帖子,user用戶,就是存儲在一個索引裏面的兩種類型。post和user兩種類型的字段個數能夠不相同,可是若是兩種類型裏面含有相同的字段名稱,好比name,那麼這個name的字段類型必須一致,即都必須爲string類型。elasticsearch
1. { 2. "mappings":{ 3. "post":{ 4. "properties":{ 5. "id":{"type":"long","store":"yes"}, 6. "name":{"type":"string","store":"yes"}, 7. "content":{"type":"string","store":"no"} 8. } 9. }, 10. "user":{ 11. "properties":{ 12. "id":{"type":"long","store":"yes"}, 13. "name":{"type":"string","store":"yes"}, 14. "age":{"type":"integer","store":"no"} 15. } 16. } 17. } 18. }
四、映射(mapping)post
就是數據結構,好比建立傳統關係型數據庫表的時候,要有一份表結構描述的文本。就是指這個。映射可以讓elasticsearch知道如何處理文檔。例如上面的mapping描述,告訴es要如何對待這些文檔。code
2、其次,再掌握elasticsearch集羣相關的基本概念索引
一、節點(node)
就是指集羣(cluster)中的每一個獨立的服務器。
二、分片(shard)
一個索引的數據,散落在不一樣的分片上。這些分片分別在不一樣的節點上。數據量大,處理能力不足,沒法快速響應客戶端的請求,一個節點不夠,就會涉及到分片。
三、副本(replica)
一個分片的精確複製。每一個分片能夠有零個或多個副本。副本,或者叫作副本分片,那麼也就對應有一個主分片,主分片負責索引的操做。
1. "settings": { 2. "number_of_shards": "32", 3. "number_of_replicas": "1" 4. },
上面這段定義,表明有32個分片,每一個分片有1個副本。以下圖:
另外集羣中Index TPS,Search TPS與副本數的關係,以下:
集羣寫入文檔TPS與副本數正相關,查詢TPS與副本數無關。
舉例:
1分鐘向集羣寫入1000個文檔:
當索引有0個副本:集羣寫入文檔次數爲1000,Index TPS爲1000/60.
當索引有1個副本:集羣寫入文檔次數爲2000,Index TPS爲2000/60.
當索引有2個副本:集羣寫入文檔次數爲3000,Index TPS爲3000/60.
1分鐘查詢1000次:
當索引有0個副本:search TPS爲 1000/60.
當索引有1個副本:search TPS爲 1000/60.
副本的數量(number_of_replicas)在建立索引以後,在集羣裏面是能夠調整的。只要你願意,同時資源又充足的條件下,你能夠刪除和添加副本。可是分片的數量(number_of_shards),就不能這樣來操做了。一旦建立好索引,再想更改分片數量,只有一個辦法,那就是建立另外一個索引,並從新索引數據。