初識搜索引擎 Elasticsearch

做者:幻好 恆生LIGHT雲社區html

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 是一個高度可擴展的開源全文搜索和分析引擎,能夠近乎實時地快速存儲搜索分析大量數據。app

Elasticsearch 的幾個重要的特色:高度可擴展、實時、存儲、搜索、分析。elasticsearch

Elasticsearch 的自己擴展性很好,能夠擴展到上百臺服務器,處理PB級別的數據。ide

illustration-solution-enterprise-search-rock-solid-555.png

Elasticsearch的做用和原理

做用

在平常開發中,數據庫也能作到(實時、存儲、搜索、分析)。相對於數據庫,Elasticsearch 的強大之處就是能夠模糊查詢函數

在數據庫中,咱們須要模糊搜索某個數據時,通常使用 like '%data%' 進行模糊查詢,可是這種查詢方式是不走索引的,若是在數據量爲上千萬或上億級時,查詢的性能會迅速降低。若是咱們想實現秒級的模糊查詢,就得使用 Elasticsearch性能

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

image-20210604150001373.png

原理

Elasticsearch 使用Lucene做爲其核心來實現全部索引和搜索的功能,可是它的目的是經過簡單的 RESTful API 來隱藏 Lucene 的複雜性,從而讓全文搜索變得簡單。

當 ElasticSearch 的節點啓動後,它會利用多播(multicast)(或者單播,若是用戶更改了配置)尋找集羣中的其它節點,並與之創建鏈接。

3e7f4c840221802537f16118d77ff221.png

Elasticsearch 實現快速的「模糊匹配」/「相關性查詢」,其實是它會你你寫入數據到 Elasticsearch 的時候會進行分詞

image-20210604153454643.png

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

若是 Term Dictionary 中的詞因爲是很是的多,因此會爲其進行排序,等要查找的時候,就能夠經過二分查詢,不須要遍歷整個 Term Dictionary

若是 Term Dictionary的詞繼續增長,不可能把 Term Dictionary 全部的詞都放在內存中,因而 Elasticsearch 還設計了一層叫作 Term Index,這層只存儲部分詞的前綴Term Index 會存在內存中,從而保證了檢索的速度。

Elasticsearch的數據類型

Elasticsearch 的數據結構相對於 MySQL,給出以下的對應關係表會更好理解。

image-20210604153517626.png

  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我。

相關文章
相關標籤/搜索