ElasticSearch 是面向文檔 ( document: oriented ), 這意味著它可以存儲(chǔ)整個(gè)對(duì)象或文檔( document ), 然后它不僅僅是存儲(chǔ), 還會(huì)索引( index )每個(gè)文檔的內(nèi)容使之可以被搜索, 在 ElasticSearch 中, 你可以對(duì)文檔 ( 而非成行成列的數(shù)據(jù) ) 進(jìn)行索引, 搜索, 排序, 過(guò)濾.
ElasticSearch 與傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)對(duì)比如下.
| 數(shù)據(jù)庫(kù) | 表 | 一條記錄/行 | 字段/列 | |
|---|---|---|---|---|
| 傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù) | Databases | Tables | Rows | Columns |
| ElasticSearch | Indices | Types | Documents | Fields |
1. 索引 ( index )
一個(gè)索引就是一個(gè)擁有幾分相似特征的文檔的集合. 比如說(shuō), 你可以有一個(gè)客戶數(shù)據(jù)的索引, 另一個(gè)產(chǎn)品目錄的索引, 還有一個(gè)訂單數(shù)據(jù)的索引. 一個(gè)索引由一個(gè)名字來(lái)標(biāo)識(shí)( 必須全部是小寫字母的 ), 并且當(dāng)我們要對(duì)對(duì)應(yīng)于這個(gè)索引中的文檔進(jìn)行索引, 搜索, 更新和刪除的時(shí)候, 都要使用到這個(gè)名字. 在一個(gè)集群中, 可以定義任意多的索引.
2. 類型( type )
在一個(gè)索引中, 你可以定義一種或多種類型. 一個(gè)類型是你的索引的一個(gè)邏輯上的分類/分區(qū), 其語(yǔ)義完全由你來(lái)定. 通常, 會(huì)有具有一組共同字段的文檔定義一個(gè)類型. 比如說(shuō), 我們假設(shè)你運(yùn)營(yíng)一個(gè)博客平臺(tái)并且將你所有的數(shù)據(jù)存儲(chǔ)到一個(gè)索引中. 在這個(gè)索引中, 你可以為用戶數(shù)據(jù)定義一個(gè)類型, 為博客數(shù)據(jù)定義另一個(gè)類型, 當(dāng)然, 也可以為評(píng)論數(shù)據(jù)定義另一個(gè)類型.
3. 字段( Field )
相當(dāng)于是數(shù)據(jù)表的字段, 對(duì)文檔數(shù)據(jù)不同屬性進(jìn)行的分類標(biāo)識(shí).
4. 映射( Mapping )
mapping 是對(duì)處理數(shù)據(jù)的方式和規(guī)則方面做一些限制, 如某個(gè)字段的數(shù)據(jù)類型, 默認(rèn)值, 分析器, 是否被索引等等. 這些都是映射里面可以設(shè)置的, 其他就是處理 ES 里面數(shù)據(jù)的一些使用規(guī)則設(shè)置也叫做映射, 按著最優(yōu)原則處理數(shù)據(jù)對(duì)性能提高很大, 因此才需要建立映射, 并且需要思考如何建立映射才能對(duì)性能更好. 對(duì)于傳統(tǒng)數(shù)據(jù)庫(kù)來(lái)說(shuō), 可以理解 Mapping 為數(shù)據(jù)庫(kù)表結(jié)構(gòu)的定義.
5. 文檔( Document )
一個(gè)文檔是一個(gè)可被搜索的基礎(chǔ)信息單元, 比如, 你可以擁有某一個(gè)客戶的文檔, 某一個(gè)產(chǎn)品的一個(gè)文檔. 當(dāng)然也可以擁有某個(gè)訂單的一個(gè)文檔. 文檔以 JSON 格式來(lái)表示, 而 JSON 是一個(gè)到處存在的胡良文數(shù)據(jù)交互格式.
在一個(gè) index/type 里面, 你可以存儲(chǔ)任意多的文檔, 注意, 盡管一個(gè)文檔, 物理上存在于一個(gè)索引之中, 文檔必須被索引/賦予一個(gè)索引的 type.
6. 接近實(shí)時(shí) NRT
ElasticSearch 是一個(gè)接近實(shí)時(shí)的搜索平臺(tái). 這意味著, 從索引一個(gè)文檔直到這個(gè)文檔能夠被搜索到有一個(gè)輕微的延遲( 通常1 秒以內(nèi) )
7. 集群 Cluster
一個(gè)集群就是由一個(gè)或多個(gè)節(jié)點(diǎn)組織在一起, 他們共同持有整個(gè)數(shù)據(jù), 并一起提供索引和搜索功能. 一個(gè)集群由一個(gè)唯一的名字標(biāo)識(shí), 這個(gè)名字默認(rèn)是 "elasticsearch" . 這個(gè)名字是非常重要的, 因?yàn)橐粋€(gè)節(jié)點(diǎn)只能通過(guò)指定某個(gè)集群的名字, 來(lái)加入這個(gè)集群.
8. 節(jié)點(diǎn) node
一個(gè)節(jié)點(diǎn)就是集群中的一個(gè)服務(wù)器, 作為集群的一部分, 它存儲(chǔ)數(shù)據(jù), 參與集群的索引和搜索功能. 和集群類似, 一個(gè)節(jié)點(diǎn)也是由一個(gè)名字來(lái)標(biāo)識(shí)的. 默認(rèn)情況下, 這個(gè)名字是一個(gè)隨機(jī)的漫威漫畫角色的名字, 這個(gè)名字會(huì)在啟動(dòng)的時(shí)候賦予節(jié)點(diǎn). 這個(gè)名字對(duì)于管理工作來(lái)說(shuō)很重要. 因?yàn)樵谡麄€(gè)管理過(guò)程中, 你會(huì)去確定網(wǎng)絡(luò)中的那些服務(wù)器對(duì)應(yīng)于 ElasticSearch 集群中的哪些節(jié)點(diǎn).
一個(gè)節(jié)點(diǎn)可以通過(guò)配置集群名稱的方式來(lái)加入一個(gè)指定的集群, 默認(rèn)情況下, 每個(gè)節(jié)點(diǎn)都會(huì)被安排加入到一個(gè)叫 "elasticsearch" 的集群中, 這意味著, 如果你在你的網(wǎng)絡(luò)中啟動(dòng)了若干個(gè)節(jié)點(diǎn), 并假定他們能夠相互發(fā)現(xiàn)彼此, 他們將會(huì)自動(dòng)加入到一個(gè)叫做 "elasticsercher" 的集群
在一個(gè)集群里, 只要你想, 可以擁有任意多個(gè)節(jié)點(diǎn). 而且, 如果當(dāng)前你的網(wǎng)絡(luò)中沒有運(yùn)行任何的 ElasticSearch 節(jié)點(diǎn), 這時(shí)候啟動(dòng)一個(gè)節(jié)點(diǎn), 就會(huì)默認(rèn)創(chuàng)建并加入到一個(gè)叫做 "elasticsercher" 的集群
9. 分片 shard
一個(gè)索引可以存儲(chǔ)超出單個(gè)節(jié)點(diǎn)硬件限制的大量數(shù)據(jù). 比如一個(gè)具有 10 億文檔的索引占用 1T 的磁盤空間, 而任一節(jié)點(diǎn)都沒有這樣大的磁盤空間, 或者單個(gè)節(jié)點(diǎn)處理搜索請(qǐng)求, 響應(yīng)太慢.
為了解決這個(gè)問(wèn)題, ElasticSearch 提供了將索引劃分成多份的能力, 這些被分成的多份就叫分片. 當(dāng)你創(chuàng)建一個(gè)索引的時(shí)候, 你可以指定你想要的分片數(shù)量. 每個(gè)分片本身也是一個(gè)功能完善并且獨(dú)立的 "索引" , 這個(gè) "索引" 可以被放置到集群中的任何節(jié)點(diǎn)上. 分片很重要, 主要有兩方面原因
- 允許你水平分割/擴(kuò)展你的內(nèi)容容量
- 允許你在分片( 潛在的, 位于多個(gè)節(jié)點(diǎn)上 )之上進(jìn)行分布式的, 并行的操作, 進(jìn)而提高性能/吞吐量.
至于一個(gè)分片怎么樣分布, 它的文檔怎么樣聚合回搜索請(qǐng)求, 是完全由 ElasticSearch 管理的. 對(duì)于作為用戶的你來(lái)說(shuō), 這些都是透明的.
10. 復(fù)制 replica
在一個(gè)網(wǎng)絡(luò)/云的環(huán)境里, 失敗隨時(shí)都可能發(fā)生, 在某個(gè)分片/節(jié)點(diǎn)有時(shí)會(huì)因?yàn)橐恍┊惓T蛱幱陔x線狀態(tài), 或者因?yàn)槟硞€(gè)原因消失了, 這種情況下, 有一個(gè)故障轉(zhuǎn)移機(jī)制是非常有用并且是強(qiáng)烈推薦的. 為了這個(gè)目的, ElasticSearch 允許你創(chuàng)建分片的一份或多份拷貝, 這些拷貝也叫復(fù)制分片, 或者直接叫復(fù)制.
復(fù)制也是非常重要的, 因?yàn)樵诜制?節(jié)點(diǎn)失敗的情況下, 提供了高可用性. 因?yàn)檫@個(gè)原因, 注意到復(fù)制分片從不與原/主要 ( original/primary ) 分片置于同一節(jié)點(diǎn)上是非常重要的. 擴(kuò)展你的搜索量/吞吐量, 因?yàn)樗阉骺梢栽谒械膹?fù)制上并行運(yùn)行.
總之每個(gè)索引可以被分成多個(gè)分片, 一個(gè)索引也可以被復(fù)制 0 次(意思是沒有復(fù)制)或者多次, 一旦復(fù)制了, 每個(gè)索引就有了主分片( 作為復(fù)制源的原來(lái)的分片 ) 和復(fù)制分片( 主分片的拷貝 )之別.
分片和復(fù)制的數(shù)量可以在索引創(chuàng)建的時(shí)候指定. 在索引創(chuàng)建之后, 你可以在任何時(shí)候動(dòng)態(tài)的改變復(fù)制的數(shù)量, 但是卻無(wú)法改變分片的數(shù)量
默認(rèn)情況下, ElasticSearch 中的每個(gè)索引被分片成 5 個(gè)主分片和 1 個(gè)復(fù)制, 這意味著, 如果你的集群中至少有兩個(gè)節(jié)點(diǎn)的話, 你的索引將會(huì)有 5 個(gè)主分片和另外 5 個(gè)復(fù)制分片( 1 個(gè)完全拷貝 ), 這樣的話每個(gè)索引總共就有 10 個(gè)分片.