es核心概念
索引(index)=數據庫
文檔(document)=每條數據
類型(type)=表結構
Elasticsearch的核心概念有Node、Cluster、Shards、Replicas、Index、Type、Document、Settings、Mapping和Analyzer
1.node: 節點
2.cluster: 集群
Elasticsearch的集群是由具有相同cluster.name (默認值為elasticsearch)的一個或多個Elasticsearch節點組成的,各個節點協同工作,共享數據。同一個集群內節點的名字不能重復,但集群名稱一定要相同。
節點的狀態有Green、Yellow和Red三種
3.shards: 分片
在Elasticsearch中,默認為一個索引創建5個主分片,並分別為每個主分片創建一個副本。
4.replics: 副本
指的是對主分片的備份,這種備份是精確復制模式。每個主分片可以有零個或多個副本,主分片和備份分片都可以對外提供數據查詢服務。當構建索引進行寫入操作時,首先在主分片上完成數據的索引,然后數據會從主分片分發到備份分片上進行索引。
5.index:索引
在Elasticsearch中,索引由一個和多個分片組成。在使用索引時,需要通過索引名稱在集群內進行唯一標識。
6.type: 類別
類別指的是索引內部的邏輯分區,通過Type的名字在索引內進行唯一標識。在查詢時如果沒有該值,則表示需要在整個索引中查詢。
7.document: 文檔
索引中的每一條數據叫作一個文檔,與關系數據庫的使用方法類似,一條文檔數據通過_id在Type內進行唯一標識
8.settings:
Settings是對集群中索引的定義信息,比如一個索引默認的分片數、副本數等
9.mapping:
Mapping表示中保存了定義索引中字段(Field)的存儲類型、分詞方式、是否存儲等信息,有點類似於關系數據庫(如MySQL)中的表結構信息。
在Elasticsearch中,Mapping是可以動態識別的。如果沒有特殊需求,則不需要手動創建Mapping,因為Elasticsearch會根據數據格式自動識別它的類型。當需要對某些字段添加特殊屬性時,如定義使用其他分詞器、是否分詞、是否存儲等,就需要手動設置Mapping了。一個索引的Mapping一旦創建,若已經存儲了數據,就不可修改了。
10.analyzer:
Analyzer表示的是字段分詞方式的定義。一個Analyzer通常由一個Tokenizer和零到多個Filter組成。在Elasticsearch中,默認的標准Analyzer包含一個標准的Tokenizer和三個Filter,即Standard Token Filter、Lower Case Token Filter和Stop Token Filter。

當我們向Elasticsearch寫入數據時,Elasticsearch根據文檔標識符ID將文檔分配到多個分片上。當查詢數據時,Elasticsearch會查詢所有的分片並匯總結果。對用戶而言,這個過程是透明的,用戶並不知道數據到底存在哪個分片上。
數據寫入過程
- 分段存儲
索引數據在磁盤上的是以分段形式存儲的。
索引文件被拆分為多個子文件,其中每個子文件就叫作段,每個段都是一個倒排索引的小單元。
刪除數據時,由於分段不可修改的特性,Elasticsearch不會把文檔從舊的段中移除,因而是新增一個.del文件,.del文件中會記錄這些被刪除文檔的段信息。被標記刪除的文檔仍然可以被查詢匹配到,但它會在最終結果被返回前通過.del文件將其從結果集中移除。
當更新數據時,由於分段不可修改的特性,Elasticsearch無法通過修改舊的段來反映文檔的更新,於是,更新操作變成了兩個操作的結合,即先刪除、后新增。Elasticsearch會將舊的文檔從.del文件中標記刪除,然后將文檔的新版本索引到一個新的段中。在查詢數據時,兩個版本的文檔都會被一個查詢匹配到,但被刪除的舊版本文檔在結果集返回前就會被移除。
倘若頻繁更新數據,則每次更新都是新增新的數據到新分段,並標記舊的分段中的數據,存儲空間的浪費會更多。
每當有新的數據寫入時,就將其先寫入JVM的內存中。在內存和磁盤之間是文件系統緩存,文件緩存空間使用的是操作系統的空間。當達到默認的時間或者內存的數據達到一定量時,會觸發一次刷新(Refresh)操作。刷新操作將內存中的數據生成到一個新的分段上並緩存到文件緩存系統,稍后再被刷新到磁盤中並生成提交點。
需要指出的是,由於新的數據會繼續寫入內存,而內存中的數據並不是以段的形式存儲的,因此不能提供檢索功能。只有當數據經由內存刷新到文件緩存系統,並生成新的段后,新的段才能供搜索使用,而不需要等到被刷新到磁盤才可以搜索。
在Elasticsearch中,寫入和打開一個新段的過程叫作刷新。在默認情況下,每個分片會每秒自動刷新一次。這就是Elasticsearch能做到近實時搜索的原因,因為文檔的變化並不是立即對搜索可見的,但會在一秒之內變為可見。
客戶端
- 獲取文檔索引的詞向量
詞向量,在Elasticsearch中的英文名稱為“Term Vectors”。那么什么是詞向量呢?我們可以通俗地理解為:詞向量是關於詞的一些統計信息的統稱。
文檔處理過程
首先需要明確一點,寫入磁盤的倒排索引是不可變的。Elasticsearch為什么要這樣做,主要是基於以下幾個考量:
(1)讀寫操作輕量級,不需要鎖。如果Elasticsearch從來不需要更新一個索引,則就不必擔心多個程序同時嘗試修改索引的情況。
(2)一旦索引被讀入文件系統的內存,它就會一直在那兒,因為不會改變。
此外,當文件系統內存有足夠大的空間時,大部分的索引讀寫操作是可以直接訪問內存,而不是磁盤就能實現的,顯然這有助於提升Elasticsearch的性能。
Elasticsearch不是重寫整個倒排索引,而是增加額外的索引反映最近的變化。每個倒排索引都可以按順序查詢,從最“老舊”的索引開始查詢,最后把結果聚合起來。
當一個文檔被刪除時,它實際上只是在.del文件中被標記為刪除。在進行文檔查詢時,被刪除的文檔依然可以被匹配查詢,但是在最終返回之前會從結果中刪除。當一個文檔被更新時,舊版本的文檔會被標記為刪除,新版本的文檔在新的段中被索引。當對文檔進行查詢時,該文檔的不同版本都會匹配一個查詢請求,但是較舊的版本會從結果中被刪除。被刪除的文件越積累越多,每個段消耗的如文件句柄、內存、CPU等資源越來越大。如果每次搜索請求都需要依次檢查每個段,則段越多,查詢就越慢。這些勢必會影響Elasticsearch的性能,那么Elasticsearch是如何處理的呢?Elasticsearch引入了段合並段。
文檔處理解析
一個索引一般由多個分片構成,當用戶執行添加、刪除、修改文檔操作時,Elasticsearch需要決定把這個文檔存儲在哪個分片上,這個過程就稱為數據路由
- 主分片的個數在索引建立之后不能修改。因為修改索引主分片數目會直接導致路由規則出現嚴重問題,部分數據將無法被檢索。
elk
小型elk

大型elk


