介紹
Elasticsearch 是一個分布式可擴展的實時搜索和分析引擎,一個建立在全文搜索引擎 Apache Lucene(TM) 基礎上的搜索引擎.當然 Elasticsearch 並不僅僅是 Lucene 那么簡單,下面就介紹ElasticSearch為什么是分布式的,可擴展,高性能,高可用。
什么是搜索
在我們想知道一些信息時,就會使用一些搜索引擎來獲取我們想要的數據,比如搜索我們喜歡的一款游戲,或者喜歡的一本書等等,這就是提到搜索的的第一印象,說直白點就是在任何場景下找尋你想要知道的信息,這就是搜索。
- 現在的搜索也稱為垂直搜索
垂直搜索引針對某一個行業的專業搜索引擎,比如說電商網站,新聞網站,各種app內部等等,他們都是搜索引擎的細分和延伸,在抽取出需要的數據進行處理后再以某種形式返回給用戶。
如果用數據庫來做搜索會怎么樣
例如我們這里有一張商品表,現在我們要搜索"衣服"這個關鍵字,,執行了 select * from products where product_name like %衣服%,(假設這里沒有其他任何提升效率的設置)來進行搜索,或者進行其他字段的匹配,可以分析一下這個方式的缺點。
-
1,比如說,每條記錄的指定字段的數據會很長,比如說“商品介紹”這個字段,可能會有幾千或者幾萬個字符,那么搜索的時候就會去這些字符里面進行匹配是否包含要搜索的關鍵詞。
-
2,這種方式只能搜索到完全包含“衣服”這個兩個字符的記錄,但是可能會有一些特殊的情況,某幾條記錄里面的“衣服”關鍵詞並不是連續的,可能衣服中間會插入某些字符,這個時候就搜索不出來這些記錄了,但是這個商品又是我們希望搜索出來的,這個時候這種方式的弊端就十分明顯了。
總的來說用數據庫來實現搜索是不太靠譜的,性能會很差。
什么是全文檢索
首先需要了解什么是倒排索引?我們這里先上一幅圖,里面有4條記錄。
現在將這4條記錄的內容進行拆分成一些詞條,這個過程叫做分詞
現在我們得到了這4條記錄拆分出來詞語,然后將這寫詞語放到一個列表中,並記錄他們的ID,這個分析出來的就是 倒排索引
現在我們輸入 生化電影 這個關鍵詞,這個時候搜素引擎將我們輸入的內容分詞為 生化 和 電影 這兩個關鍵詞,然后使用這個兩個關鍵詞去倒排索引里面匹配,發現包含 生化 這個關鍵詞的記錄有ID為 1,2,3,4這四條記錄,包含 電影 這個關鍵詞的有ID為1這條記錄,由於ID為1這條記錄已經被錄入了,所以就被排除在外了, 這時候我們就得到了想要ID為1234這4條記錄,同理,如果我們只輸入 電影 這個關鍵詞,那么符合條件的只有ID為1這條記錄了。
全文檢索就是從拆分詞語,存入倒排索引,然后分析用戶輸入的內容,在倒排索引里面進行匹配,這個過程就是全文檢索。
什么是ElasticSearch
首先需要知道什么是lucene,lucene它就是一個Java的jar包,里面實現了倒排索引的算法和其他的全文檢索相關的東西,ElasticSearch就是對lucene進行了封裝,為什么有lucene了還要ElasticSeaearch來干什么呢?首先,當數據量很大的時候,比如有1PB的數據,這個時候數據放在同一台機器上基本就不行了,那么把數據分開來放在多台機器上呢?那就變成分布式了,這個時候數據前端獲取數據的時候到底去那一台機器上面去獲取數據呢?這個時候就很麻煩了,如果某一台機器宕機了,那么這個機器上的數據就獲取不到了,這也就無法保證高可用性了,還有數據存儲的時候怎么到底存入那台機器等等,這些都需要人為的處理和維護。這個時候ElasticSearch就應運而生了,它就將lucene這些弊端給完全解決了。
舉例一些優點
- 高性能,自動維護數據分布到多個節點進行索引的建立,還有搜索請求分布到多個節點的執行。
- 高可用,自動維護數據的冗余副本,保證說,一些機器宕機了,不會造成數據的丟失。
- 封裝了更多的高級功能,以給我們提供更多的高級支持,讓我們快速的開發應用,開發更加復雜的應用,復雜的搜索功能,聚合分析的功能,基於地理位置的搜索(比如周圍一公里內有幾家咖啡廳)等等。
- 動態擴容,當我們數據量急劇提升的時候,我們只需要增加機器就行了,比如兩台機器存放1.2T數據,那么沒台機器存放就是600G,但是如果600G對於服務器的壓力太大了,這個時候就需要增加第三台機器,讓他們每人負責400G的數據,這個過程不需要人為的去分配,只需要將汲取加入集群中就自動完成。