一篇搞懂ElasticSearch(附學習腦圖)

2021-02-19 程序控

既然你點進來了,說明你了解過ES或者是對ES感興趣,這一篇目的在於掃盲,主要以概念理解為主,可能會比較枯燥,但是天將降大任於斯人也,必先...

這篇我以ElasticSearch是什麼、底層原理、特點和應用場景三部分來讓大家入門ElasticSearch

文章末尾白嫖es學習腦圖,要個關注不過分吧?

            

了解ElasticSearch

先看看排名,很強的位置吧,學起來,讓你薪資翻啊翻,一個月因為學會了一門技術多領個幾千塊薪資難道不香嗎?

ElasticSearch,大家可能都是聽說過它是個用於做搜索的,也有可能是可能沒聽過,不知道大家對它的認知達到什麼程度呢?如果你是沒聽說過或者是只是了解,這篇文章正好適合你,帶你真正學習ElasticSearch,如果你用的比較多,也可以讀讀,查漏補缺,廢話少說,我們開始吧

1、ElasticSearch是什麼?

ElasticSearch是一個實時的分布式存儲、搜索和分析的引擎

Elasticsearch is a real-time, distributed storage, search, and analytics engine

什麼是搜尋引擎?所謂搜尋引擎,就是根據用戶需求和一定的算法,運用特定策略從網際網路檢索出制定信息反饋給用戶的一種搜索技術

國內搜尋引擎有百度、360、搜狗等,國外的有谷歌、雅虎、Yandex這些

ElasticSearch是用Java語言編寫的,基於Restful接口的,使用Json格式存儲數據(屬於文檔存儲)的一款分布式全文檢索框架。千言萬語不如一張圖,這是es和mysql的對比(大家應該對mysql很熟悉了吧!)

索引index:可以把索引index比作mysql中的資料庫,索引名稱必須為小寫,索引是一個邏輯命名空間映射到一個或多個主要的分片,可以有零個或多個副本分片

類型type:把類型type比作比作mysql中的一張表,但是從es6.0版本默認type是log,後續版本將不再使用type這個概念

文檔document:可以被檢索的最小單元,類似於資料庫mysql中的一條記錄,可以包含多個欄位,使用json格式和服務端交互

除了上面三個主要的,還有一些ElasticSearch中的名詞,一起理解下

欄位Field:類似於mysql中的column,文檔中包含的一組欄位或者是鍵值對,欄位的值可以是一個簡單的(標量)值(如字符串,整數,日期),或者一個嵌套的結構就像一個數組或對象

映射Mapping:像是mysql中的模式定義,每個索引有一個映射,定義了索引中各個Field的類型,映射可以自己定義,也可以自動生成

DSL:相當於資料庫的SQL,可用來查詢讀取數據

集群Cluster:一個集群包含一個或多個分配了相同的集群名稱的節點。每個集群都有一個主節點是集群自動選擇產生,並且可以決定如果當前主節點失敗,哪些可以替換

節點Node:節點是屬於elasticsearch群集的運行實例。測試的時候,在一臺伺服器可以啟動多個節點,但通常情況下應該在一臺伺服器運行一個節點。在啟動時,節點將使用單播(或組播,但是必須指定)來發現使用相同的群集名稱的群集,並會嘗試加入集群

切片Shards:即把一個大文件分割成多個小文件然後分散到集群中的多個節點上,可以類比mysql中的分庫和分表,這樣做好處就是可以把索引較大的數據分散到多臺伺服器上,減少壓力,可以調動整個集群的資源,處理效率也會提高,默認情況下es會將用戶的index拆分成5個shard,也可以在創建索引的時候通過number_of_shards參數指定shard的數量(注意:索引一旦創建,shard值是不可變的)

副本Replicas:即某個文件的拷貝,就是備份數據,兩個文件一模一樣,保證數據不會因為誤刪而導致丟失,查詢的時候兩個都可以查看,也可以提高查詢效率

replica是相對與shard而言的,一般成對使用,比如你有一個索引,shard設置為5,replica設置為1,那麼總的切片數為shard(5) + shard(5) * replicas(1) = total(10);如果有5臺data節點,每臺節點上都會存儲兩個不相同的shard,這樣某臺data節點壞掉集群能從其它節點上保存了整個index的5個shard,所以不影響正常使用;一旦有新的節點加入,集群可以從其它節點將shard再次存儲在該節點,從而保證集群高可用性

replica可在index創建後更改,其值越大搜索效率越高,但寫入性能越低(一條數據寫入操作需要做(1+replicas)遍),具體值與集群data節點數量相關,不宜超過【data節點數-1】

2、ElasticSearch底層原理

我們可能聽過es底層是採用Lucene設計的,也聽過倒排索引這種名詞,或許你也可能聽過什麼分詞、中文分詞器這些,到底怎麼一回事呢?

接下來我們從倒排索引、分詞這兩部分來了解es到底是如何設計的

倒排索引VS正排索引

舉一個例子,現在有ID為1、2、3、4的四個文檔

ID
VALUE
1
一個程式設計師2一個公眾號程序控3
程式設計師瀏覽程序控的文章4程式設計師關注公眾號程序控

我們有上面幾條數據,如果是正排索引存儲會以ID作為索引,來查詢相應的數據,假如我想查詢含有程序控的數據,底層需要遍歷所有的數據,判斷是否符合標準,如果數據量很大,則會導致經常性的全表掃描,有人是不是要說,我把這個欄位設置成索引就可以加速查詢了?

告訴你不是的,你想想在mysql中我要是用like進行模糊查詢一定會走索引嗎,不一定,如果你用前導模糊查詢"%程序控"這種則不會走索引,如果用非前導模糊查詢"程序控%"則會走索引,你可以去用explain去實踐下,實踐出真知

正排索引會導致全表掃描,效率低下,於是倒排索引登場了,還是看上面例子,就會變成

詞條
ID
一個
1、2程式設計師
1、3、4
關注
4瀏覽
3公眾號
2、3、4
程序控
2、3、4

3
文章
3

我相信你應該已經明白一二了這個時候,倒排表以字或詞為關鍵字進行索引,表中關鍵字所對應的記錄表項記錄了出現這個字或詞的所有文檔,一個表項就是一個字表段,它記錄該文檔的ID和字符在該文檔中出現的位置情況

由於每個字或詞對應的文檔數量在動態變化,所以倒排表的建立和維護都較為複雜,但是在查詢的時候由於可以一次得到查詢關鍵字所對應的所有文檔,所以效率高於正排表。在全文檢索中,檢索的快速響應是一個最為關鍵的性能,而索引建立由於在後臺進行,儘管效率相對低一些,但不會影響整個搜尋引擎的效率

正排索引是從文檔到關鍵字的映射(已知文檔求關鍵字),倒排索引是從關鍵字到文檔的映射(已知關鍵字求文檔)

分詞

在上面的倒排索引中你可能會存在一個問題,我怎麼知道它是關注、程式設計師、公眾號這樣分詞的呢?為什麼不能是關注程這樣分詞?

es裡面可以指定分詞器,根據大量的數據算法來對中文進行分詞,讓es可以更聰明的知道如何對中文分詞,es默認的標準分詞器對中文的分詞不是很友好,會將中文詞語拆分成一個個中文的漢字,因此這裡引入別的中文分詞器,應用最多的是ik中文分詞器,而且我們也可以自己配置特定的詞庫

es的數據結構

es會根據分詞器對我們的內容進行分詞,也就是上圖中的Ada、Allen、Sara、Selena這些,這些分詞彙總起來叫做Term Dictionary裡面,每一個分詞對應的文檔ID則存儲在PostingList中,由於Term Dictionary中的詞會越來越多,所以這裡會對Term Dictionary進行排序,查找的時候則根據二分法來查找,不需要遍歷整個Dictionary

正是由於Dictionary中詞很多,我們不能把所有詞都放在內存中,於是es又加了一層Term index,這裡可以存儲詞語的前綴,Term Index這塊會存儲在內存中,所以速度會很快,Term Index在內存中是以FST(Finite State Transducers)形式保存的,會很節省內存

FST的兩個優點:

PostingList也有對應的優化,PostingList使用FOR編碼技術對裡邊的數據進行壓縮,節約磁碟空間

PostingList裡邊存的是文檔ID,檢索的時候經常需要對文檔的ID進行交集和併集的操作,比如多個條件檢索,PostingList使用Roaring Bitmaps來對文檔ID進行交併集操作,

使用Roaring Bitmaps(一種基於BitMaori的數據結構和壓縮算法)的好處是可以節省空間和快速得出交併集的結果,感興趣的可以去研究一波

3、特點和應用場景

其實我覺得看了上面那些,特點應該大家也能知道個七七八八了,接下來我來總結下

支持快速的全文檢索引擎和數據分析引擎(倒排索引和分詞技術)

可以作為一個大型分布式集群,處理PB級數據,也可以運行單機服務小公司

底層是基於Lucene封裝的,使用json格式存儲數據

同義詞處理、相關度排名、海量數據的近實時處理

不支持事務,還有各種聯機事務型的操作

場景一:使用ElasticSearch作為主要的後端,作為搜尋引擎

在傳統的項目中,搜尋引擎是部署在成熟的數據存儲的頂部,因為早期的搜尋引擎不能提供存儲或者其他的功能,我們只是為了提高快速檢索能力引入

Es提供持久存儲、統計等多項強大的功能,是一款現代的搜尋引擎,如果你剛開始一個新項目,可以考慮用es作為唯一數據存儲,這樣設計會更簡單,但是這種情況需要個人斟酌是否符合應用場景,場景不支持頻繁更新、事務等操作

舉個例子:新建的一個博客系統使用es作為存儲,我們可以向es提交新的博文存儲,使用es進行檢索、統計數據等

場景二:在現有系統增加ElasticSearch

由於ES不能提供存儲的所有功能,一些場景下需要在現有系統數據存儲的基礎上新增ES支持

場景三:使用ElasticSearch和現有的工具

在一些使用情況下,您不必寫一行代碼就能通過elasticssearch完成一項工作。很多工具都可以與Elasticsearch一起工作,所以你不必到你從頭開始編寫。
例如,假設要部署一個大規模的日誌框架存儲,搜索,並分析了大量的事件。
如圖下圖,處理日誌和輸出到Elasticsearch,您可以使用日誌記錄工具,如rsyslog,Logstash,或Apache Flume(http://flume.apache.org),搜索和可視化界面分析這些日誌,你可以使用Kibana

白嫖

白嫖一時爽,一直白嫖一直爽

(來源https://blog.csdn.net/laoyang360/article/details/89716974)

相關焦點

  • ElasticSearch-hard插件及IK分詞器安裝
    ElasticSearch-hard插件及IK分詞器安裝通過上一篇學習,我們學會了ElasticSearch的安裝及訪問到了如下頁面:編輯ElasticSearch-head插件安裝為什麼需要安裝head
  • 《Elasticsearch 權威指南》中文版
    在幾十位社區同學的共同努力下,《Elasticsearch 權威指南》的翻譯工作接近尾聲,在線訪問連結如下:
  • 深入淺出 spring-data-elasticsearch 之 ElasticSearch 架構初探(一)
    1.2 集群(Cluster)、節點(Node)、分片(Shard)分布式三要素二、Elasticsearch 工作原理2.1 文檔存儲的路由2.2 如何健康檢查2.3 如何水平擴容三、小結一、Elasticsearch 基本術語1.1 文檔(Document)、索引(Index)、類型(Type)文檔三要素文檔
  • elasticsearch Discovery 發現模塊學習
    一、基於單播的方式發現可以在 elasticsearch.yml 配置文件中使用discovery.zen.ping.unicast.hosts靜態設置設置主機列表。discovery.zen.ping.unicast.hosts: ["host1", "host2"]具體的值是一個主機數組或逗號分隔的字符串。
  • ElasticSearch
    2 ESClient對象創建 • 在SpringBoot中定義類,將連接信息通過yaml等配置文件的形式自動進行裝配 @Component @ConfigurationProperties(prefix = "elasticsearch
  • Open Distro for Elasticsearch 1.1.0 發布,Elasticsearch 發行版
    Open Distro for Elasticsearch 是 AWS 開源的 Elasticsearch 發行版。可以 GitHub 存儲庫中的發行說明中找到有關增強、bug 修復和更多信息的詳細信息:https://github.com/opendistro-for-elasticsearch新特性此版本中提供一些新的插件,以便集成到開發者的應用程式中,雖然這些插件屬於 alpha 版本。
  • Elasticsearch實現原理分析
    本文是分析Elasticsearch系列文章中的一篇,是一個譯文。共有三個部分,每部分講解部分Elasticsearch的實現原理。
  • Elasticsearch官方文檔離線訪問實操指南
    直接上個圖:不能讓 Elasticsearch 文檔限制了你我的學習熱情!2、直接開幹步驟1:訪問:https://zealdocs.org/步驟3:輸入elasticsearch 搜索下載官方文檔到本地。
  • Elasticsearch Analyzer
    Elasticsearch內置了40+種分詞過濾器,這裡不再一一贅述。3 Specify the analyzer for a text fieldmapping analyzer參數可以為特定欄位設定分析器。一旦設定完畢,那麼在index或search階段將會使用該分析器進行文本分析。
  • Hadoop 讀寫 Elasticsearch
    使用Hadoop操作Elasticsearch的方法,關鍵是指定InputFormatClass : EsInputFormat.classOutputFormatClass: EsOutputFormat.class,這個好像是ES官方提供的集成包。網上查了相關資料貌似挺少的。
  • elasticsearch 八、重要的配置更改
    集群名稱改成elasticsearch_production,這麼一個簡單的修改可以避免很多的痛心。Elasticseach by default starts a cluster named elasticsearch.
  • 在elasticsearch中使用function_score查詢
    一、先看語法_search{  "query":{  "function_score":{  "query":{        "match_all":{}   },       "functions":[               {        "gauss":{
  • 2021-Java後端工程師面試指南-(Elasticsearch)
    文本已收錄至我的GitHub倉庫,歡迎Star:https://github.com/bin392328206/six-finger種一棵樹最好的時間是十年前,其次是現在Tips面試指南系列,很多情況下不會去深挖細節,是小六六以被面試者的角色去回顧知識的一種方式,所以我默認大部分的東西,作為面試官的你,肯定是懂的
  • 全文搜尋引擎ElasticSearch入門教程
    $ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.5.1.zip  $ unzip elasticsearch-5.5.1.zip  $ cd elasticsearch-5.5.1/  接著,進入解壓後的目錄,運行下面的命令,啟動 Elastic。
  • 基於Ansj 的 elasticsearch 2.3.1 中文分詞插件
    前言這是一個elasticsearch的中文分詞插件,基於Ansj中文分詞。發起者Onni大神。
  • 為什麼Elasticsearch查詢變得這麼慢了?
    默認情況下,所有版本的Elasticsearch都會關閉慢速日誌,因此您必須對群集設置和索引設置進行一些更新。這些示例適用於使用elasticsearch 6.2,但您可以在此處找到所有以前的版本。 只需將$ES_version替換為您正在使用的版本,例如5.5版本設置官網參考:http://t.cn/E7Hq2NG。
  • 這篇實戰攻略,帶你輕鬆入門Elastic search
    elasticsearch: image: elasticsearch:7.2.0 container_name: es-simple environment: - cluster.name=mytestes #這裡就是ES集群的名稱 - node.name=es-simple #節點名稱 -
  • Elasticsearch高階使用方法有哪些?
    學習計劃安排,關於搜索功能:搜索結果過濾的補充說明。布爾組合查詢、範圍查詢…等多種高級查詢。以及非常重要的聚合查詢,其兩種常用類型:桶和度量的說明與使用。根據我們這兩天的學習情況就可以簡單地實現,具體添加了哪些數據就不做說明了。桶的使用size表示是查詢條數,我這裡設置為1,主要在於一個了解,重點在於聚合結果。
  • 如何使用Elasticsearch和cAdvisor監控Docker容器
    /elasticsearch/data    --constraint node.hostname==worker1    --name elasticsearch elasticsearch:2.4.0  注意 Elasticsearch 容器被限定在 worker1 節點,這是因為它運行時需要依賴 worker1 節點上掛載的卷。
  • 搜尋引擎 Elasticsearch 中文擴展分詞器使用,更快更準確!
    Elasticsearch是一個基於Lucene,Lucene是開源的Java索引檢索組件。它提供了一個分布式多用戶能力的全文搜尋引擎,基於RESTful web接口。Elasticsearch是用Java語言開發的,並作為Apache許可條款下的開放源碼發布,是一種流行的企業級搜尋引擎。