在學習一門技術時,咱們首先想到的資料確定是官方文檔,這是最權威的第一手資料。然而,有些官方文檔中出現的概念,若是沒有必定知識儲備,看起來會顯得晦澀難懂。就好比在ES中,有幾個核心概念咱們必需要理解,這些在官方文檔中每每做爲術語來使用,只有理解了這些概念才能更深刻的學習ES。下面是我在學習ES過程當中,對ES核心概念的總結,結合了官方文檔和本身的理解,若是發現描述有錯誤,請你們在評論區留言,多多交流!html
字段在ES中能夠理解爲JSON數據的鍵,下面的JSON數據中,name 就是一個字段。數據庫
{ "name":"jack" }
文檔 在ES中至關於傳統數據庫中的行的概念,ES中的數據都以JSON的形式來表示,在MySQL中插入一行數據和ES中插入一個JSON文檔是一個意思。下面的JSON數據表示,一個包含3個字段的文檔。json
{ "name":"jack", "age":18, "gender":1 }
映射 是對文檔中每一個字段的類型進行定義,每一種數據類型都有對應的使用場景。例如:string
的數據會被做爲全文原本處理,這種數據類型適合須要搜索的場景。有些數據類型,你不須要對它進行搜索,相反須要對它作聚合運算,那麼keyword
、integer
數據類型就更合適。
正如上面說的,每一個文檔都有映射,可是在大多數使用場景中,咱們並不須要顯示的建立映射,由於ES中實現了動態映射。咱們在索引中寫入一個下面的JSON文檔,在動態映射的做用下,name
會映射成text
類型,age
會映射成long
類型。服務器
{ "name":"jack", "age":18, }
既然有動態映射,咱們固然也能夠自定義映射,在深度使用中,咱們須要對數據類型進行精確的控制,以達到咱們實際場景的要求,ES可能不知道咱們須要數據類型,這種狀況下咱們可使用自定義映射。經過映射API,咱們能夠方便的建立
、修改
、查看
、刪除
映射。架構
索引是ES中最大的數據單元,至關於關係型數據庫中 庫
的概念。前面咱們說一個文檔 至關於MySQL中一行數據,若是按照關係型數據庫中的對應關係,還應該有表
的概念。ES中沒有表
的概念,這是ES和數據庫的一個區別,在咱們創建索引以後,能夠直接往 索引 中寫入文檔。在6.0版本以前,ES中有Type
的概念,能夠理解成關係型數據庫中的表
,可是官方說這是一個設計上的失誤,因此在6.0版本以後Type
就被廢棄了。app
上面咱們說索引是ES中最大的數據存儲單元,咱們能夠往索引中不斷寫入文檔,到了必定數量級,索引文件就會佔滿整個服務器的磁盤,磁盤容量只是其中一個問題,索引文件變的大,會嚴重下降搜索的效率。怎麼解決這個問題呢?分片就是用來解決這些問題的,簡單來說,分片就是把單索引文件分紅多份存儲,且這些索引的分片能夠分部在不一樣的機器上。假設單臺機器磁盤容量1TB,如今須要存放5TB的索引數據,那就能夠把5TB索引分紅10份,分別存放到10臺機器上每份500G,這就是所謂的分片
。負載均衡
咱們已經知道,一個索引能夠分紅多個分片,分部在不一樣的機器上。那假設上面所說的10臺機器中有一臺發生故障了,在這臺機器上的分片也就沒了,就會致使索引損壞。爲了解決索引高可用的問題,ES引入了副本機制,這裏的副本指的就是分片的副本,分片的原始數據稱爲主分片
,主分片和副本會放在不一樣的機器上,這樣假設有一個分配丟失了,另外的分片能夠做爲後備。若是主分片的機器掛掉了,其中一個副本分片就會升級成主分片。同時,由於副本分片的工做和主分片是同樣的,因此增長副本的數量能夠提高查詢性能。性能
在傳統關係型數據庫中,假如想要存儲一篇幾千字的文本,能夠經過text
直接存進去,和存儲其它類型的數據沒什麼不一樣。存儲雖然很方便,可是要對文本中的關鍵詞進行搜索,查詢速度很是慢,尤爲是在大數據量的時候。仍是上面的場景,在ES中存儲這篇文章,它不會直接存進去,而是先把大文本切割成不少個小的詞,這些詞就是咱們所說的詞項
,它是ES搜索的最小單位,每一個查詢都是按詞項
搜索的。ES使用了倒排索引
來存儲數據,什麼是倒排索引?在關係型數據中,最好的方式是用主鍵id來查詢,能夠快速定位到文章內容,而倒排索引
則相反,它創建的是詞項
和文章id的對應關係,索引它更適合文本搜索,下面是一個倒排索引,hello和world這兩個詞都命中了id=1的文章。學習
詞項 term | 文章id |
---|---|
hello | 1 |
world | 1 |
倒排索引底層原理決定了ES天生適合作全文本搜索。大數據
前面說過,ES中不會把一篇文章直接存入磁盤,在存儲時它會先對文本進行分析,分析器的就是用來分析這些文本,中間包括過濾、分詞等過程,通過分析處理後再存儲到磁盤。分析器由3部分組成,分別是字符過濾器
、分詞器
和詞項處理器
。字符過濾器把原始文本做爲字符流來處理,它能夠過濾一些特殊字符、html標籤等;分詞器
是分析器的核心部分,它負責把大文本分割成多個詞項
,好比文本 "Quick brown fox!"
,能夠被分割成 3個詞項,[Quick, brown, fox!]
;詞項處理器
接受詞項流,它能夠移除一些不須要的詞。ES提供了多種分析器,默認使用標準的分析器,能知足大部分的需求,實在不行也可使用自定義的分析器
,除了分析器之外,分詞器、字符過濾器等在ES中也提供了多種選擇。
簡單來說,節點就是一個ElasticSearch進程,當咱們啓動一個ElasticSearch程序,就啓動了一個節點,不少個節點集合在一塊兒就成了集羣,即便只有單個節點,也能夠把它當作只有單個節點的集羣。節點也分多種類型,主要分爲 主節點、數據節點、協調節點和Ingest節點,每一個節點都有各自的職責,若是集羣中只有單個節點,那這個節點會扮演多個節點的角色,它須要獨自完成整個搜索和索引的過程。集羣對外提供服務時,至關於一個總體,集羣中的每一個節點均可以處理Http請求,每一個請求通過一系列內部轉發,處理完成後返回數據給外部客戶端。集羣內部每一個節點之間通訊使用Java API ,它的底層是基於TCP的自定義協議,而對於外部客戶端,ES使用的是Restful風格的Http協議。
說了這麼多核心概念,可能一會兒很差理解,下圖是我畫的ElasticSearch的總體架構圖。集羣中有4個節點,其中2個爲數據節點,專門用來存放數據和創建索引,索引P由2個分片組成,分片P1和P2的主分片分別存放在數據節點-2
和數據節點-1
中,P1和P2各有1個副本分片,存放在另外一臺數據節點中,這樣能夠保證的即便數據節點-1
掛掉了,數據節點-2
仍然有完整的數據,P2的副本分片將升級爲主分片;主節點負責一些輕量級的操做,用於分片分配等;協調節點只能用於請求的路由,至關於負載均衡器。每一個節點之間經過點對點的方式進行TCP通訊,請求不須要通過主節點。
最後,但願本篇文章能幫助你理解ES的核心概念!