## 基本概念
<div style="text-indent:2em">讓我們一起把ElasticSearch的基本概念和其特性瀏覽一遍。</div>
### 索引(Index)
<div style="text-indent:2em">ElasticSearch把數據存放到一個或者多個索引(indices)中。如果用關系型數據庫模型對比,索引(index)的地位與數據庫實例(database)相當。索引存放和讀取的基本單元是文檔(Document)。我們也一再強調,ElasticSearch內部用Apache Lucene實現索引中數據的讀寫。讀者應該清楚的是:在ElasticSearch中被視為單獨的一個索引(index),在Lucene中可能不止一個。這是因為在分布式體系中,ElasticSearch會用到分片(shards)和備份(replicas)機制將一個索引(index)存儲多份。</div>
### 文檔(Document)
<div style="text-indent:2em">在ElasticSearch的世界中,文檔(Document)是主要的存在實體(在Lucene中也是如此)。所有的ElasticSearch應用需求到最后都可以統一建模成一個檢索模型:檢索相關文檔。文檔(Document)由一個或者多個域(Field)組成,每個域(Field)由一個域名(此域名非彼域名)和一個或者多個值組成(有多個值的值稱為多值域(multi-valued))。在ElasticSeach中,每個文檔(Document)都可能會有不同的域(Field)集合;也就是說文檔(Document)是沒有固定的模式和統一的結構。文檔(Document)之間保持結構的相似性即可(Lucene中的文檔(Document)也秉持著相同的規定)。實際上,ElasticSearch中的文檔(Document)就是Lucene中的文檔(Document)。從客戶端的角度來看,文檔(Document)就是一個JSON對象(關于JSON格式的相關信息,請參看hhtp://en.wikipedia.org/wiki/JSON)。</div>
### 參數映射(Mapping)
<div style="text-indent:2em">在 <span style="font-style:oblique"> 1.1節 認識Apache Lucene </span> 中已經提到,所有的文檔(Document)在存儲之前都必須經過分析(analyze)流程。用戶可以配置輸入文本分解成Token的方式;哪些Token應該被過濾掉;或者其它的的處理流程,比如去除HTML標簽。此外,ElasticSearch提供的各種特性,比如排序的相關信息。保存上述的配置信息,這就是參數映射(Mapping)在ElasticSearch中扮演的角色。盡管ElasticSearch可以根據域的值自動識別域的類型(field type),在生產應用中,都是需要自己配置這些信息以避免一些奇的問題發生。要保證應用的可控性。</div>
### 文檔類型(Type)
<div style="text-indent:2em">每個文檔在ElasticSearch中都必須設定它的類型。文檔類型使得同一個索引中在存儲結構不同文檔時,只需要依據文檔類型就可以找到對應的參數映射(Mapping)信息,方便文檔的存取。</div>
### 節點(Node)
<div style="text-indent:2em">單獨一個ElasticSearch服務器實例稱為一個節點。對于許多應用場景來說,部署一個單節點的ElasticSearch服務器就足夠了。但是考慮到容錯性和數據過載,配置多節點的ElasticSearch集群是明智的選擇。</div>
### 集群(Cluster)
<div style="text-indent:2em">集群是多個ElasticSearch節點的集合。這些節點齊心協力應對單個節點無法處理的搜索需求和數據存儲需求。集群同時也是應對由于部分機器(節點)運行中斷或者升級導致無法提供服務這一問題的利器。ElasticSearch提供的集群各個節點幾乎是無縫連接(所謂無縫連接,即集群對外而言是一個整體,增加一個節點或者去掉一個節點對用戶而言是透明的<個人理解,僅供參考>)。在ElasticSearch中配置一個集群非常簡單,在我們看來,這是在與同類產品中競爭所體現出的最大優勢。</div>
### 分片索引(Shard)
<div style="text-indent:2em">前面已經提到,集群能夠存儲超出單機容量的信息。為了實現這種需求,ElasticSearch把數據分發到多個存儲Lucene索引的物理機上。這些Lucene索引稱為分片索引,這個分發的過程稱為索引分片(Sharding)。在ElasticSearch集群中,索引分片(Sharding)是自動完成的,而且所有分片索引(Shard)是作為一個整體呈現給用戶的。需要注意的是,盡管索引分片這個過程是自動的,但是在應用中需要事先調整好參數。因為集群中分片的數量需要在索引創建前配置好,而且服務器啟動后是無法修改的,至少目前無法修改。</div>
### 索引副本(Replica)
<div style="text-indent:2em">通過索引分片機制(Sharding)可以向ElasticSearch集群中導入超過單機容量的數據,客戶端操作任意一個節點即可實現對集群數據的讀寫操作。當集群負載增長,用戶搜索請求阻塞在單個節點上時,通過索引副本(Replica)機制就可以解決這個問題。索引副本(Replica)機制的的思路很簡單:為索引分片創建一份新的拷貝,它可以像原來的主分片一樣處理用戶搜索請求。同時也順便保證了數據的安全性。即如果主分片數據丟失,ElasticSearch通過索引副本使得數據不丟失。索引副本可以隨時添加或者刪除,所以用戶可以在需要的時候動態調整其數量。</div>
### 時間之門(Gateway)
<div style="text-indent:2em">在運行的過程中,ElasticSearch會收集集群的狀態、索引的參數等信息。這些數據被存儲在Gateway中。</div>
- 前言
- 第1章 認識Elasticsearch
- 認識Apache Lucene
- 熟悉Lucene
- 總體架構
- 分析你的文本
- Lucene查詢語言
- 認識 ElasticSearch
- 基本概念
- ElasticSearch背后的核心理念
- ElasticSearch的工作原理
- 本章小結
- 第2章 強大的用戶查詢語言DSL
- Lucene默認打分算法
- 查詢重寫機制
- 重排序
- 批處理
- 查詢結果的排序
- Update API
- 使用filters優化查詢
- filters和scope在ElasticSearch Faceting模塊的應用
- 本章小結
- 第3章 索引底層控制
- 第4章 探究分布式索引架構
- 選擇恰當的分片數量和分片副本數量
- 路由功能淺談
- 調整集群的分片分配
- 改變分片的默認分配方式
- 查詢的execution preference
- 學以致用
- 本章小結
- 第5章 管理Elasticsearch
- 選擇正確的directory實現類——存儲模塊
- Discovery模塊的配置
- 索引段數據統計
- 理解ElasticSearch的緩存
- 本章小結
- 第6章 應對突發事件
- 第7章 優化用戶體驗
- 第8章 ElasticSearch Java API
- 第9章 開發ElasticSearch插件