做者:幻好 恆生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
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的壓縮算法,集羣,分片,副本複製等,以及相關技術的實踐應用。
以爲文章對你有幫助能夠點贊評論一塊兒交流哦,歡迎call我。