初識搜尋引擎 Elasticsearch
Elasticsearch產生的背景
為了解決上述問題,我們最先想到的是關係型資料庫的叢集方式儲存資料,通過中介軟體的方式將查詢語句傳送到對於的叢集庫中;或者通過非關係資料庫將資料存到各個節點,然後檢索各個節點,最後返回需要的資料;亦或將我們常用資料存入記憶體中,查詢時直接通過記憶體查得。
但以上這些我們通常的方式,好像並不能完全解決日益增長的資料量處理的問題,基於這種問題背景下,就引出了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,給出如下的對應關係表會更好理解。
-
MySQL 中的資料庫(DataBase),等價於 ES 中的索引(Index)。
-
MySQL 中一個數據庫下面有 N 張表(Table),等價於1個索引 Index 下面有 N 多型別(Type)。
-
MySQL 中一個數據庫表(Table)下的資料由多行(Row)多列(column,屬性)組成,等價於1個 Type 由多個文件(Document)和多 Field 組成。
-
MySQL 中定義表結構、設定欄位型別等價於 ES 中的 Mapping。舉例說明,在一個關係型資料庫裡面,Schema 定義了表、每個表的欄位,還有表和欄位之間的關係。與之對應的,在 ES 中,Mapping 定義索引下的 Type 的欄位處理規則,即索引如何建立、索引型別、是否儲存原始索引 JSON 文件、是否壓縮原始 JSON 文件、是否需要分詞處理、如何進行分詞處理等。
-
MySQL 中的增 insert、刪 delete、改 update、查 search 操作等價於 ES 中的增 PUT/POST、刪 Delete、改 _update、查 GET。其中的修改指定條件的更新 update 等價於 ES 中的 update_by_query,指定條件的刪除等價於 ES 中的 delete_by_query。
-
MySQL 中的 group by、avg、sum 等函式類似於 ES 中的 Aggregations 的部分特性。
-
MySQL 中的去重 distinct 類似 ES 中的 cardinality 操作。
-
MySQL 中的資料遷移等價於 ES 中的 reindex 操作。
最後
本文只是簡單的介紹一下ES的一些基礎知識,後續文章會繼續分享ES的壓縮演算法,叢集,分片,副本複製等,以及相關技術的實踐應用。