ElasticSearch—10大核心概念

前言

在學習一門技術時,咱們首先想到的資料確定是官方文檔,這是最權威的第一手資料。然而,有些官方文檔中出現的概念,若是沒有必定知識儲備,看起來會顯得晦澀難懂。就好比在ES中,有幾個核心概念咱們必需要理解,這些在官方文檔中每每做爲術語來使用,只有理解了這些概念才能更深刻的學習ES。下面是我在學習ES過程當中,對ES核心概念的總結,結合了官方文檔和本身的理解,若是發現描述有錯誤,請你們在評論區留言,多多交流!html

字段 Field

字段在ES中能夠理解爲JSON數據的鍵,下面的JSON數據中,name 就是一個字段。數據庫

{
    "name":"jack"
}

文檔 Document

文檔 在ES中至關於傳統數據庫中的的概念,ES中的數據都以JSON的形式來表示,在MySQL中插入一行數據和ES中插入一個JSON文檔是一個意思。下面的JSON數據表示,一個包含3個字段的文檔json

{
    "name":"jack",
    "age":18,
    "gender":1
}

映射Mapping

映射 是對文檔中每一個字段的類型進行定義,每一種數據類型都有對應的使用場景。例如:string的數據會被做爲全文原本處理,這種數據類型適合須要搜索的場景。有些數據類型,你不須要對它進行搜索,相反須要對它作聚合運算,那麼keywordinteger 數據類型就更合適。
正如上面說的,每一個文檔都有映射,可是在大多數使用場景中,咱們並不須要顯示的建立映射,由於ES中實現了動態映射。咱們在索引中寫入一個下面的JSON文檔,在動態映射的做用下,name會映射成text類型,age會映射成long類型。服務器

{
    "name":"jack",
    "age":18,
}

既然有動態映射,咱們固然也能夠自定義映射,在深度使用中,咱們須要對數據類型進行精確的控制,以達到咱們實際場景的要求,ES可能不知道咱們須要數據類型,這種狀況下咱們可使用自定義映射。經過映射API,咱們能夠方便的建立修改查看刪除映射。架構

索引 Index

索引是ES中最大的數據單元,至關於關係型數據庫中 的概念。前面咱們說一個文檔 至關於MySQL中一行數據,若是按照關係型數據庫中的對應關係,還應該有的概念。ES中沒有的概念,這是ES和數據庫的一個區別,在咱們創建索引以後,能夠直接往 索引 中寫入文檔。在6.0版本以前,ES中有Type的概念,能夠理解成關係型數據庫中的,可是官方說這是一個設計上的失誤,因此在6.0版本以後Type就被廢棄了。app

分片 Shards

上面咱們說索引是ES中最大的數據存儲單元,咱們能夠往索引中不斷寫入文檔,到了必定數量級,索引文件就會佔滿整個服務器的磁盤,磁盤容量只是其中一個問題,索引文件變的大,會嚴重下降搜索的效率。怎麼解決這個問題呢?分片就是用來解決這些問題的,簡單來說,分片就是把單索引文件分紅多份存儲,且這些索引的分片能夠分部在不一樣的機器上。假設單臺機器磁盤容量1TB,如今須要存放5TB的索引數據,那就能夠把5TB索引分紅10份,分別存放到10臺機器上每份500G,這就是所謂的分片負載均衡

副本 Replicas

咱們已經知道,一個索引能夠分紅多個分片,分部在不一樣的機器上。那假設上面所說的10臺機器中有一臺發生故障了,在這臺機器上的分片也就沒了,就會致使索引損壞。爲了解決索引高可用的問題,ES引入了副本機制,這裏的副本指的就是分片的副本,分片的原始數據稱爲主分片,主分片和副本會放在不一樣的機器上,這樣假設有一個分配丟失了,另外的分片能夠做爲後備。若是主分片的機器掛掉了,其中一個副本分片就會升級成主分片。同時,由於副本分片的工做和主分片是同樣的,因此增長副本的數量能夠提高查詢性能。性能

詞項 term

在傳統關係型數據庫中,假如想要存儲一篇幾千字的文本,能夠經過text直接存進去,和存儲其它類型的數據沒什麼不一樣。存儲雖然很方便,可是要對文本中的關鍵詞進行搜索,查詢速度很是慢,尤爲是在大數據量的時候。仍是上面的場景,在ES中存儲這篇文章,它不會直接存進去,而是先把大文本切割成不少個小的詞,這些詞就是咱們所說的詞項 ,它是ES搜索的最小單位,每一個查詢都是按詞項搜索的。ES使用了倒排索引來存儲數據,什麼是倒排索引?在關係型數據中,最好的方式是用主鍵id來查詢,能夠快速定位到文章內容,而倒排索引則相反,它創建的是詞項和文章id的對應關係,索引它更適合文本搜索,下面是一個倒排索引,hello和world這兩個詞都命中了id=1的文章。學習

詞項 term 文章id
hello 1
world 1

倒排索引底層原理決定了ES天生適合作全文本搜索。大數據

分析器 Analyzers

前面說過,ES中不會把一篇文章直接存入磁盤,在存儲時它會先對文本進行分析,分析器的就是用來分析這些文本,中間包括過濾、分詞等過程,通過分析處理後再存儲到磁盤。分析器由3部分組成,分別是字符過濾器分詞器詞項處理器。字符過濾器把原始文本做爲字符流來處理,它能夠過濾一些特殊字符、html標籤等;分詞器是分析器的核心部分,它負責把大文本分割成多個詞項,好比文本 "Quick brown fox!",能夠被分割成 3個詞項,[Quick, brown, fox!] 詞項處理器接受詞項流,它能夠移除一些不須要的詞。ES提供了多種分析器,默認使用標準的分析器,能知足大部分的需求,實在不行也可使用自定義的分析器,除了分析器之外,分詞器、字符過濾器等在ES中也提供了多種選擇。

節點 Node & 集羣 Cluster

簡單來說,節點就是一個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的核心概念!
圖片描述

相關文章
相關標籤/搜索