1. 程式人生 > 其它 >初識搜尋引擎 Elasticsearch

初識搜尋引擎 Elasticsearch

作者:幻好 恆生LIGHT雲社群

Elasticsearch產生的背景

人工智慧、大資料快速發展的今天,對於 TB 甚至 PB 級大資料的快速檢索已然成為剛需。隨著資料量級別的快速增大,在系統中對於資料的處理就會出現很多問題,比如:資料達到上百億時,如果能對資料進行快速檢索,找到我們想要的資料?

為了解決上述問題,我們最先想到的是關係型資料庫的叢集方式儲存資料,通過中介軟體的方式將查詢語句傳送到對於的叢集庫中;或者通過非關係資料庫將資料存到各個節點,然後檢索各個節點,最後返回需要的資料;亦或將我們常用資料存入記憶體中,查詢時直接通過記憶體查得。

但以上這些我們通常的方式,好像並不能完全解決日益增長的資料量處理的問題,基於這種問題背景下,就引出了Elasticsearch

Elasticsearch是什麼

Elasticsearch is a highly scalable open-source full-text search and analytics engine.It allows you to store, search, and analyze big volumes of data quickly and in near real time.(參考

Elasticsearch 是一個高度可擴充套件的開源全文搜尋和分析引擎,可以近乎實時地快速儲存搜尋分析大量資料。

Elasticsearch 的幾個重要的特點:高度可擴充套件、實時、儲存、搜尋、分析。

Elasticsearch 的本身擴充套件性很好,可以擴充套件到上百臺伺服器,處理PB級別的資料。

Elasticsearch的作用和原理

作用

在日常開發中,資料庫也能做到(實時、儲存、搜尋、分析)。相對於資料庫,Elasticsearch 的強大之處就是可以模糊查詢

在資料庫中,我們需要模糊搜尋某個資料時,一般使用 like '%data%' 進行模糊查詢,但是這種查詢方式是不走索引的,如果在資料量為上千萬或上億級時,查詢的效能會迅速下降。如果我們想實現秒級的模糊查詢,就得使用 Elasticsearch

Elasticsearch 最常見的場景就是我們的搜尋引擎,每次我們在搜尋引擎輸入一些關鍵字的時候,就能幫我們找到近似的結果。

原理

Elasticsearch 使用Lucene作為其核心來實現所有索引和搜尋的功能,但是它的目的是通過簡單的 RESTful API 來隱藏 Lucene 的複雜性,從而讓全文搜尋變得簡單。

當 ElasticSearch 的節點啟動後,它會利用多播(multicast)(或者單播,如果使用者更改了配置)尋找叢集中的其它節點,並與之建立連線。

Elasticsearch 實現快速的“模糊匹配”/“相關性查詢”,實際上是它會你你寫入資料到 Elasticsearch 的時候會進行分詞

在搜尋引擎中輸入一段文字,Elasticsearch 會通過分詞器對查詢的文字進行分詞,這些分詞彙總起來就是 Term Dictionary ,然後通過分詞找到對應的記錄,這些文件點 token 儲存在 PostingList

如果 Term Dictionary 中的詞由於是非常的多,所以會為其進行排序,等要查詢的時候,就可以通過二分查詢,不需要遍歷整個 Term Dictionary

如果 Term Dictionary的詞繼續增加,不可能把 Term Dictionary 所有的詞都放在記憶體中,於是 Elasticsearch 還設計了一層叫做 Term Index,這層只儲存部分詞的字首Term Index 會存在記憶體中,從而保證了檢索的速度。

Elasticsearch的資料型別

Elasticsearch 的資料結構相對於 MySQL,給出如下的對應關係表會更好理解。

  1. MySQL 中的資料庫(DataBase),等價於 ES 中的索引(Index)。

  2. MySQL 中一個數據庫下面有 N 張表(Table),等價於1個索引 Index 下面有 N 多型別(Type)。

  3. MySQL 中一個數據庫表(Table)下的資料由多行(Row)多列(column,屬性)組成,等價於1個 Type 由多個文件(Document)和多 Field 組成。

  4. MySQL 中定義表結構、設定欄位型別等價於 ES 中的 Mapping。舉例說明,在一個關係型資料庫裡面,Schema 定義了表、每個表的欄位,還有表和欄位之間的關係。與之對應的,在 ES 中,Mapping 定義索引下的 Type 的欄位處理規則,即索引如何建立、索引型別、是否儲存原始索引 JSON 文件、是否壓縮原始 JSON 文件、是否需要分詞處理、如何進行分詞處理等。

  5. MySQL 中的增 insert、刪 delete、改 update、查 search 操作等價於 ES 中的增 PUT/POST、刪 Delete、改 _update、查 GET。其中的修改指定條件的更新 update 等價於 ES 中的 update_by_query,指定條件的刪除等價於 ES 中的 delete_by_query。

  6. MySQL 中的 group by、avg、sum 等函式類似於 ES 中的 Aggregations 的部分特性。

  7. MySQL 中的去重 distinct 類似 ES 中的 cardinality 操作。

  8. MySQL 中的資料遷移等價於 ES 中的 reindex 操作。

最後

本文只是簡單的介紹一下ES的一些基礎知識,後續文章會繼續分享ES的壓縮演算法,叢集,分片,副本複製等,以及相關技術的實踐應用。

覺得文章對你有幫助可以點贊評論一起交流哦,歡迎call我。