Elastic Search学习笔记
一:單機模式
數據格式
Elasticsearch是面向文檔型數據庫,一條數據在這里就是一個文檔。為了方便大家理解,我們將Elasticsearch里存儲文檔 數據和關系型數據庫 MySQL存儲數據的概念進行一個類比。
??ES里的Index可以看做一個庫,而Types相當于表Documents 則相當于表的行。這里Types的概念已經被逐漸弱化,Elasticsearch 6.X中,一個index下已經只能包含一個type,Elasticsearch 7.X中,Type的概念已經被刪除了。
Postman使用:創建索引
1.創建索引:
冪等性:GET,PUT,DELETE具有冪等性,多次操作結果一樣。如圖,PUT兩次,第二次顯示索引已經存在
2.獲取索引:
3.展示當前所有的索引
4.刪除索引:
創建文檔
索引已經創建好了,接下來我們來創建文檔,并添加數據。這里的文檔可以類比為關系型數據庫中的表數據,添加的數據格式為JSON格式
在Postman中,向ES服務器發POST請求: http://127.0.0.1:9200/shopping/_doc
自定義Id
主鍵查詢創建的文檔數據:
全部查詢:
全量數據修改:
局部數據修改:
刪除數據:
查詢操作(復雜查詢)
1.條件查詢:
2.請求體中查詢:
學習資料:https://www.bilibili.com/video/BV1hh411D7sb?p=29&spm_id_from=pageDriver&vd_source=448c4278f465153c0ee1bf76577b40ba
二:集群模式——ES學習
集群 Cluter
??一個集群就是由一個或多個服務器節點組織在一起,共同持有整個的數據,并一起提供索引和搜索功能。一個 Elasticsearch集群有一個唯一的名字標識,這個名字默認就是"”elasticsearch”。這個名字是重要的,因為一個節點只能通過指定某個集群的名字,來加入這個集群。
節點Node
??集群中包含很多服務器,一個節點就是其中的一個服務器。作為集群的一部分,它存儲數據,參與集群的索引和搜索功能。
??一個節點也是由一個名字來標識的,默認情況下,這個名字是一個隨機的漫威漫畫角色的名字,這個名字會在啟動的時候賦予節點。這個名字對于管理工作來說挺重要的,因為在這個管理過程中,你會去確定網絡中的哪些服務器對應于Elasticsearch集群中的哪些節點。
??一個節點可以通過配置集群名稱的方式來加入一個指定的集群。默認情況下,每個節點都會被安排加入到一個叫做"elasticseanch”的集群中,這意味著,如果你在你的網絡中啟動了若干個節點,并假定它們能夠相互發現彼此,它們將會自動地形成并加入到一個叫做"elasticsearch”的集群中。
Linux環境下集群部署ES
三:ES核心概念
1 索引 index
??一個索引就是一個擁有幾分相似特征的文檔的集合。比如說,你可以有一個客戶數據的索引,另一個產品目錄的索引,還有一個訂單數據的索引。一個索引由一個名字來標識(必須全部是小寫字母),并且當我們要對這個索引中的文檔進行索引、搜索、更新和刪除的時候,都要使用到這個名字。在一個集群中,可以定義任意多的索引。
??能搜索的數據必須索引,這樣的好處是可以提高查詢速度,比如:新華字典前面的目錄就是索引的意思,目錄可以提高查詢速度。
??Elasticsearch索引的精髓:一切設計都是為了提高搜索的性能。
2 類型Type
在一個索引中,你可以定義一種或多種類型。
一個類型是你的索引的一個邏輯上的分類/分區,其語義完全由你來定。通常,會為具有一組共同字段的文檔定義一個類型。不同的版本,類型發生了不同的變化
3 文檔document
??一個文檔是一個可被索引的基礎信息單元,也就是一條數據
??比如:你可以擁有某一個客戶的文檔,某一個產品的一個文檔,當然,也可以擁有某個訂單的一個文檔。文檔以JSON (Javascript Object Notation)格式來表示,而JSON是一個到處存在的互聯網數據交互格式。
??在一個index/type 里面,你可以存儲任意多的文檔。
4 字段Field
相當于是數據表的字段,對文檔數據根據不同屬性進行的分類標識。
5 映射mapping
??mapping是處理數據的方式和規則方面做一些限制,如:某個字段的數據類型、默認值、分析器、是否被索引等等結構信息。這些都是映射里面可以設置的,其它就是處理ES里面數據的一些使用規則設置也叫做映射,按著最優規則處理數據對性能提高很大,因此才需要建立映射,并且需要思考如何建立映射才能對性能更好。
6 分片 Shards
??一個索引可以存儲超出單個節點硬件限制的大量數據。比如,一個具月10億乂白蟻掂的索引占據1TB的磁盤空間,而任一節點都可能沒月這懺人的儆工間。蟻有平T點處理搜索請求,響應太慢。為了解決這個問題,Elasticsearch 提供了將索引劃分成多份的能力,每一份就稱之為分片。當你創建一個索引的時候,你可以指定你想要的分片的數量。每個分片本身也是一個功能完善并且獨立的“索引”,這個“索引”可以被放置到集群中的任何節點上。
??類似mysql分表。
?分片很重要,主要有兩方面的原因:
??1)允許你水平分割/擴展你的內容容量。
??2)允許你在分片之上進行分布式的、并行的操作,進而提高性能/吞吐量。
??至于一個分片怎樣分布,它的文檔怎樣聚合和搜索請求,是完全由Elasticsearch管理的,對于作為用戶的你來說,這些都是透明的,無需過分關心。
被混淆的概念是,一個Lucene索引我們在 Elasticsearch稱作分片。一個Elasticsearch 索引是分片的集合。當 Elasticsearch 在索引中搜索的時候,他發送查詢到每一個屬于索引的分片(Lucene索引),然后合并每個分片的結果到一個全局的結果集。
7 副本Replicas
??在一個網絡Ⅰ云的環境里,失敗隨時都可能發生,在某個分片/節點不知怎么的就處于離線狀態,或者由于任何原因消失了,這種情況下,有一個故障轉移機制是非常有用并且是強烈推薦的。為此目的,Elasticsearch允許你創建分片的一份或多份拷貝,這些拷貝叫做復制分片(副本)。
?復制分片之所以重要,有兩個主要原因:
??1):在分片/節點失敗的情況下,提供了高可用性。因為這個原因,注意到復制分片從不與原/主要( original/primary)分片置于同一節點上是非常重要的。
??2):擴展你的搜索量/吞吐量,因為搜索可以在所有的副本上并行運行。
??總之,每個索引可以被分成多個分片。一個索引也可以被復制0次(意思是沒有復制)或多次。一旦復制了,每個索引就有了主分片(作為復制源的原來的分片)和復制分片(主分片的拷貝)之別。分片和復制的數量可以在索引創建的時候指定。在索引創建之后,你可以在任何時候動態地改變復制的數量,但是你事后不能改變分片的數量。默認情況下,Elasticsearch中的每個索引被分片1個主分片和1個復制;這意味著,如果你的集群中至少有兩個節點,你的索引將會有1個主分片和另外1個復制分片(1個完全拷貝),這樣的話每個索引總共就有2個分片,我們需要根據索引需要確定分片個數。
8 分配 Allocation
??將分片分配給某個節點的過程,包括分配主分片或者副本。如果是副本,還包含從主分片復制數據的過程。這個過程是由master節點完成的。
四 :系統架構
備份不能在同一個主機上。
五 分布式集群
1 單點集群
我們的集群現在是擁有一個索引的單節點集群。所有3個主分片都被分配在 node-1 。
通過插件查看集群狀態
當前我們的集群是正常運行的,但是在硬件故障時有丟失數據的風險。
在同一個節點上既保存原始數據又保存副本是沒有意義的,因為一旦失去了那個節點,我們也將丟失該節點上的所有副本數據。
2 故障轉移
??當集群中只有一個節點在運行時,意味著會有一個單點故障問題——沒有冗余。幸運的是,我們只需再啟動一個節點即可防止數據丟失。當你在同一臺機器上啟動了第二個節點時,只要它和第一個節點有同樣的cluster.name配置,它就會自動發現集群并加入到其中。但是在不同機器上啟動節點的時候,為了加入到同一集群,你需要配置一個可連接到的單播主機列表。之所以配置為使用單播發現,以防止節點無意中加入集群。只有在同一臺機器上運行的節點才會自動組成集群。
??如果啟動了第二個節點,我們的集群將會擁有兩個節點的集群︰所有主分片和副本分片都已被分配。
查看集群健康狀況(兩個節點)
3 水平擴容(三個節點)
??Node 1和 Node2上各有一個分片被遷移到了新的Node3節點,現在每個節點上都擁有2個分片,而不是之前的3個。這表示每個節點的硬件資(CPU,RAM,IO)將被更少的分片所共享,每個分片的性能將會得到提升。
??分片是一個功能完整的搜索引擎,它擁有使用一個節點上的所有資源的能力。我們這個擁有6個分片(3個主分片和3個副本分片)的索引可以最大擴容到6個節點,每個節點上存在一個分片,并且每個分片擁有所在節點的全部資源。
4 路由計算,分片控制
保存:保存數據只能由主分片處理,副本只能讀取數據。(圖中綠色為主分片,紫色為副本)
查詢:
數據寫流程:
??在客戶端收到成功響應時,文檔變更已經在主分片和所有副本分片執行完成,變更是安全的。有一些可選的請求參數允許您影響這個過程,可能以數據安全為代價提升性能。這些選項很少使用,因為Elasticsearch已經很快,但是為了完整起見,請參考下面表格:
??**新索引默認有1個副本分片,這意味著為滿足規定數量應該需要兩個活動的分片副本。但是,這些默認的設置會阻止我們在單一節點上做任何事情。為了避免這個問題,要求只有number_of replicas 大于1的時候,規定數量才會執行。
**
數據讀流程:
倒排索引
??Elasticsearch使用一種稱為倒排索引的結構,它適用于快速的全文搜索。
??見其名,知其意,有倒排索引,肯定會對應有正向索引。正向索引(forward index) ,反向索引( inverted index)更熟悉的名字是倒排索引。
??所謂的正向索引,就是搜索引擎會將待搜索的文件都對應一個文件D,搜索時將這個ID和搜索關鍵字進行對應,形成K-V對,然后對關鍵字進行統計計數
倒排索引搜索過程
根據關鍵詞先找到id,再根據id查詢內容。
文檔刷新
沖突解決(類似 樂觀鎖)
多線程操作的時候,可能會出現順序紊亂,導致數據不對。例如 x = 3;
用戶A,把數據加二
用戶B,把數據減一
如果兩者并發操作,順序打亂,則最后的結果不正確。
解決辦法:樂觀鎖,增加版本號控制
Kibana
ES面試題
1. 為什么要使用ES?
2.ES的master選舉流程
3. ES集群腦裂問題
解決辦法:
4 ES 索引文檔流程
P0:主分片。R0:副本
5. ES更新和刪除文檔流程
6. ES搜索流程
7. 優化
8. GC方面需要注意什么?
9. ES對于大數據的聚合是如何實現的?
10. 并發讀寫一致性?
11. 如何監控ES集群狀態?
12. 字典樹
字典結構如下圖:
13. 集群,節點,索引,文檔,類型是什么?
14. 倒排索引
ES新版本
Kibana可視化工具 使用ES
第三方插件 IK 中文分詞器
自定義分詞效果
我們在使用IK分詞器時會發現其實有時候分詞的效果也并不是我們所期待的,有時一些特殊得術語會被拆開,比如上面得中文“一個學生”希望不要拆開,怎么做呢?其實K插件給我們提供了自定義分詞字典,我們就可以添加自己想要保留得字了。
在IK分詞器的config文件夾中創建一個dic結尾的文件
在添加的.dic文件中,test.dic中寫入分詞規則:如圖,“我是一個三好學生”
接下來修改配置文件
總結
以上是生活随笔為你收集整理的Elastic Search学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Verilog实现八人抢答器
- 下一篇: Snap Chrome浏览器及展示如何在