## 介紹
Elasticsearch 是一個分布式可擴(kuò)展的實時搜索和分析引擎,一個建立在全文搜索引擎 Apache Lucene(TM) 基礎(chǔ)上的搜索引擎.當(dāng)然 Elasticsearch 并不僅僅是 Lucene 那么簡單,下面就介紹ElasticSearch為什么是分布式的,可擴(kuò)展,高性能,高可用。
## 什么是搜索
在我們想知道一些信息時,就會使用一些搜索引擎來獲取我們想要的數(shù)據(jù),比如搜索我們喜歡的一款游戲,或者喜歡的一本書等等,這就是提到搜索的的第一印象,說直白點就是在任何場景下找尋你想要知道的信息,這就是搜索。
- 現(xiàn)在的搜索也稱為垂直搜索
垂直搜索引針對某一個行業(yè)的專業(yè)搜索引擎,比如說電商網(wǎng)站,新聞網(wǎng)站,各種app內(nèi)部等等,他們都是搜索引擎的細(xì)分和延伸,在抽取出需要的數(shù)據(jù)進(jìn)行處理后再以某種形式返回給用戶。
## 如果用數(shù)據(jù)庫來做搜索會怎么樣
例如我們這里有一張商品表,現(xiàn)在我們要搜索"衣服"這個關(guān)鍵字,,執(zhí)行了 **select * from products where product_name like %衣服%**,(假設(shè)這里沒有其他任何提升效率的設(shè)置)來進(jìn)行搜索,或者進(jìn)行其他字段的匹配,可以分析一下這個方式的缺點。
- 1,比如說,每條記錄的指定字段的數(shù)據(jù)會很長,比如說**“商品介紹”**這個字段,可能會有幾千或者幾萬個字符,那么搜索的時候就會去這些字符里面進(jìn)行匹配是否包含要搜索的關(guān)鍵詞。
- 2,這種方式只能搜索到完全包含**“衣服”**這個兩個字符的記錄,但是可能會有一些特殊的情況,某幾條記錄里面的**“衣服”**關(guān)鍵詞并不是連續(xù)的,可能衣服中間會插入某些字符,這個時候就搜索不出來這些記錄了,但是這個商品又是我們希望搜索出來的,這個時候這種方式的弊端就十分明顯了。
總的來說用數(shù)據(jù)庫來實現(xiàn)搜索是不太靠譜的,性能會很差。

## 什么是全文檢索
首先需要了解什么是倒排索引?我們這里先上一幅圖,里面有4條記錄。

現(xiàn)在將這4條記錄的內(nèi)容進(jìn)行拆分成一些詞條,這個過程叫做分詞

現(xiàn)在我們得到了這4條記錄拆分出來詞語,然后將這寫詞語放到一個列表中,并記錄他們的ID,這個分析出來的就是 **倒排索引**

現(xiàn)在我們輸入 **生化電影** 這個關(guān)鍵詞,這個時候搜素引擎將我們輸入的內(nèi)容分詞為 **生化** 和 **電影** 這兩個關(guān)鍵詞,然后使用這個兩個關(guān)鍵詞去倒排索引里面匹配,發(fā)現(xiàn)包含 **生化** 這個關(guān)鍵詞的記錄有ID為 1,2,3,4這四條記錄,包含 **電影** 這個關(guān)鍵詞的有ID為1這條記錄,由于ID為1這條記錄已經(jīng)被錄入了,所以就被排除在外了, 這時候我們就得到了想要ID為1234這4條記錄,同理,如果我們只輸入 **電影** 這個關(guān)鍵詞,那么符合條件的只有ID為1這條記錄了。
全文檢索就是從拆分詞語,存入倒排索引,然后分析用戶輸入的內(nèi)容,在倒排索引里面進(jìn)行匹配,這個過程就是全文檢索。
## 什么是ElasticSearch
首先需要知道什么是lucene,lucene它就是一個Java的jar包,里面實現(xiàn)了倒排索引的算法和其他的全文檢索相關(guān)的東西,ElasticSearch就是對lucene進(jìn)行了封裝,為什么有l(wèi)ucene了還要ElasticSeaearch來干什么呢?首先,當(dāng)數(shù)據(jù)量很大的時候,比如有1PB的數(shù)據(jù),這個時候數(shù)據(jù)放在同一臺機(jī)器上基本就不行了,那么把數(shù)據(jù)分開來放在多臺機(jī)器上呢?那就變成分布式了,這個時候數(shù)據(jù)前端獲取數(shù)據(jù)的時候到底去那一臺機(jī)器上面去獲取數(shù)據(jù)呢?這個時候就很麻煩了,如果某一臺機(jī)器宕機(jī)了,那么這個機(jī)器上的數(shù)據(jù)就獲取不到了,這也就無法保證高可用性了,還有數(shù)據(jù)存儲的時候怎么到底存入那臺機(jī)器等等,這些都需要人為的處理和維護(hù)。這個時候ElasticSearch就應(yīng)運(yùn)而生了,它就將lucene這些弊端給完全解決了。
### 舉例一些優(yōu)點
1.? 高性能,自動維護(hù)數(shù)據(jù)分布到多個節(jié)點進(jìn)行索引的建立,還有搜索請求分布到多個節(jié)點的執(zhí)行。
2.? 高可用,自動維護(hù)數(shù)據(jù)的冗余副本,保證說,一些機(jī)器宕機(jī)了,不會造成數(shù)據(jù)的丟失。
3.? 封裝了更多的高級功能,以給我們提供更多的高級支持,讓我們快速的開發(fā)應(yīng)用,開發(fā)更加復(fù)雜的應(yīng)用,復(fù)雜的搜索功能,聚合分析的功能,基于地理位置的搜索(比如周圍一公里內(nèi)有幾家咖啡廳)等等。
4.? 動態(tài)擴(kuò)容,當(dāng)我們數(shù)據(jù)量急劇提升的時候,我們只需要增加機(jī)器就行了,比如兩臺機(jī)器存放1.2T數(shù)據(jù),那么沒臺機(jī)器存放就是600G,但是如果600G對于服務(wù)器的壓力太大了,這個時候就需要增加第三臺機(jī)器,讓他們每人負(fù)責(zé)400G的數(shù)據(jù),這個過程不需要人為的去分配,只需要將汲取加入集群中就自動完成。