用最簡單的話告訴你什麼是ElasticSearch

fallinjava發表於2019-03-01

介紹

Elasticsearch 是一個分散式可擴充套件的實時搜尋和分析引擎,一個建立在全文搜尋引擎 Apache Lucene(TM) 基礎上的搜尋引擎.當然 Elasticsearch 並不僅僅是 Lucene 那麼簡單,下面就介紹ElasticSearch為什麼是分散式的,可擴充套件,高效能,高可用。

什麼是搜尋

在我們想知道一些資訊時,就會使用一些搜尋引擎來獲取我們想要的資料,比如搜尋我們喜歡的一款遊戲,或者喜歡的一本書等等,這就是提到搜尋的的第一印象,說直白點就是在任何場景下找尋你想要知道的資訊,這就是搜尋。

  • 現在的搜尋也稱為垂直搜尋 垂直搜尋引針對某一個行業的專業搜尋引擎,比如說電商網站,新聞網站,各種app內部等等,他們都是搜尋引擎的細分和延伸,在抽取出需要的資料進行處理後再以某種形式返回給使用者。

如果用資料庫來做搜尋會怎麼樣

例如我們這裡有一張商品表,現在我們要搜尋"衣服"這個關鍵字,,執行了 select * from products where product_name like %衣服%,(假設這裡沒有其他任何提升效率的設定)來進行搜尋,或者進行其他欄位的匹配,可以分析一下這個方式的缺點。

  • 1,比如說,每條記錄的指定欄位的資料會很長,比如說**“商品介紹”**這個欄位,可能會有幾千或者幾萬個字元,那麼搜尋的時候就會去這些字元裡面進行匹配是否包含要搜尋的關鍵詞。

  • 2,這種方式只能搜尋到完全包含**“衣服”這個兩個字元的記錄,但是可能會有一些特殊的情況,某幾條記錄裡面的“衣服”**關鍵詞並不是連續的,可能衣服中間會插入某些字元,這個時候就搜尋不出來這些記錄了,但是這個商品又是我們希望搜尋出來的,這個時候這種方式的弊端就十分明顯了。

總的來說用資料庫來實現搜尋是不太靠譜的,效能會很差。

用最簡單的話告訴你什麼是ElasticSearch

什麼是全文檢索

首先需要了解什麼是倒排索引?我們這裡先上一幅圖,裡面有4條記錄。

用最簡單的話告訴你什麼是ElasticSearch
現在將這4條記錄的內容進行拆分成一些詞條,這個過程叫做分詞
用最簡單的話告訴你什麼是ElasticSearch
現在我們得到了這4條記錄拆分出來詞語,然後將這寫詞語放到一個列表中,並記錄他們的ID,這個分析出來的就是 倒排索引
用最簡單的話告訴你什麼是ElasticSearch
現在我們輸入 生化電影 這個關鍵詞,這個時候搜素引擎將我們輸入的內容分詞為 生化電影 這兩個關鍵詞,然後使用這個兩個關鍵詞去倒排索引裡面匹配,發現包含 生化 這個關鍵詞的記錄有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. 高效能,自動維護資料分佈到多個節點進行索引的建立,還有搜尋請求分佈到多個節點的執行。
  2. 高可用,自動維護資料的冗餘副本,保證說,一些機器當機了,不會造成資料的丟失。
  3. 封裝了更多的高階功能,以給我們提供更多的高階支援,讓我們快速的開發應用,開發更加複雜的應用,複雜的搜尋功能,聚合分析的功能,基於地理位置的搜尋(比如周圍一公里內有幾家咖啡廳)等等。
  4. 動態擴容,當我們資料量急劇提升的時候,我們只需要增加機器就行了,比如兩臺機器存放1.2T資料,那麼沒臺機器存放就是600G,但是如果600G對於伺服器的壓力太大了,這個時候就需要增加第三臺機器,讓他們每人負責400G的資料,這個過程不需要人為的去分配,只需要將汲取加入叢集中就自動完成。

相關文章