目錄
1 什麼是Elasticsearch?
2 Elasticsearch的特點
3 Elasticsearch基礎概念
4 Elasticsearch基本資料類型(看這裡)
5 Elasticsearch基本檢索類型
5.1 檢索和過濾
5.2 結構化檢索
5.3 全文檢索
5.4 複合檢索
5.5 特定檢索
6 Elasticsearch基本基本聚合類型
6.1 Metric聚合
6.2 Buckting聚合
6.3 Pipeline聚合
7 Elasticsearch基本操作類型
7.1 Elasticsearch叢集基本操作
7.2 Elasticsearch索引基本操作
7.3 Elasticsearch文檔基本操作
7.4 Elasticsearch常用的工具
8 Elasticsearch進階
8.1 Elasticsearch叢集規劃
8.2 Elasticsearch資料模組化
8.3 Elasticsearch生命周期管理
8.4 Elasticsearch寫入性能優化
8.5 Elasticsearch檢索性能優化
8.6 Elasticsearch磁盤讀寫優化
8.7 Elasticsearch插件開發
9 Elasticsearch實踐
1 什麼是Elasticsearch?
Elasticsearch是一個面向文檔的實時的分布式搜尋分析引擎。關于Elasticsearch與另一個搜尋引擎Solr的比較看這裡。
學習路線圖
2 Elasticsearch的特點
- 反向索引又叫反向索引,是根據文章内容中的關鍵字建立索引。
- 搜尋引擎原理就是建立反向索引。
- Elasticsearch 在 Lucene 的基礎上進行封裝,實作了分布式搜尋引擎。
- Elasticsearch 中的索引、類型和文檔的概念比較重要,類似于 MySQL 中的資料庫、表和行。
- Elasticsearch 也是 Master-slave 架構,也實作了資料的分片Shard和備份Replia。
- Elasticsearch 一個典型應用就是 ELK 日志分析系統。
關于Elasticsearch相關的系統版本和JVM版本支援(看這裡)
3 Elasticsearch基礎概念
- 索引(index)對應資料庫
- 類型(type)對應資料庫中的資料表(注意:ES6.0以後就不支援一個索引指定多個類型了,預設一個類型且不能修改)
- 文檔(Document)文檔是存儲在ES中的一個JSON字元串,相當于資料庫中表的具體資料行。
- 字段(Field)對應資料庫中每一行資料的具體的列
- ID序列:ID是一個未接的唯一辨別,如果在庫中沒有提供ID,系統會自動生成一個ID
- 映射(Mapping)代表索引的結構,類似于資料庫表結構。動态映射和靜态映射
- 索引模闆(template): 使用索引模闆
- 路由:當存儲一個文檔的時候,它會存儲在唯一的主分片中。内部routing算法将資料路由到各個分片:shard = hash(routing) % number_of_primary_shards,
是一個可變值,預設是文檔的routing
,也可以設定成一個自定義的值,_id
主分片的數量number_of_primary_shards
4 Elasticsearch基本資料類型(看這裡)
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL90TUjVDaH5UNrRVT1A3MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLwMDN4UDMzQTMwMDMxkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
5 Elasticsearch基本檢索類型
5.1 檢索和過濾
- 檢索和過濾的差別(看這裡)
- 檢索和過濾的适用場景,針對他們的差別可以确定各自的使用場景
5.2 結構化檢索
- 精确比對檢索:term查詢單值精确比對、terms查詢多值精确比對,terms_set多值比對并且可以定義傳回文檔所需的比對術語數
- 範圍檢索:range query(低版本用 range filter)
- 存在與否檢索:exists query
- 字首查詢:prefix query
- 通配符檢索:wildcard query
- 正則檢索:regexp query
- 類型檢索:type query
- id檢索:ids query
- 模糊查詢:fuzzy query,與通配符查詢類似,但是fuzzy查詢,當搜尋條件是個不準确的單詞或詞時,可以自動幫助糾正後查詢
5.3 全文檢索
- 分詞全文檢索:match
- 布爾字首檢索:match_bool_prefix
- 短語檢索:match_phrase
- 短語字首檢索:match_phrase_prefix
- 多字段比對檢索:multi_match
- 支援與或非的字元串檢索:query_string
- 簡化的字元串檢索:simple_query_string
- 間隔檢索:intervals
5.4 複合檢索
- 固定得分檢索 看這裡
- bool組合檢索:must、should(通過minimum_should_match指定比對的個數)、must_not、filter 看這裡
- 改變評分檢索:boosting、function score、dis max query
5.5 特定檢索
- 嵌套檢索:nested query
- 父子檢索:has_child query、has_parent query、parent_id query
- 地理檢索:geo 查詢 和 distance_feature query(查詢更接近提供的
日期或時間點的資料。或者查詢來查找某個位置最近的鄰居)origin
- 相似文檔檢索:more_like_this
- 腳本檢索:script query
6 Elasticsearch基本基本聚合類型
6.1 Metric聚合
- 去重統計:cardinality
- 平均統計:Avg
- 最大和最小統計:Max、Min
- 求和統計:Sum
- 統計彙總:Stats(包含平均值、最大最小值、總數)
- 更多
6.2 Buckting聚合
- terms按字段分組統計:terms
- 根據字段值統計:histogram
- 根據時間值統計:datehistogram
- 根據時間段統計:daterange(可以指定時間段格式和具體查詢的時間區間)
- 過濾Filter聚合:filter 和 filters
- 嵌套聚合:nested
- 更多
6.3 Pipeline聚合
- bucked script聚合:bucket script
- bucked selector聚合:bucket selector
- bucked sort聚合:bucket sort
- Avg/Max/Min/Sum bucked聚合
- 更多
7 Elasticsearch基本操作類型
7.1 Elasticsearch叢集基本操作
- 叢集健康狀态分類:green健康,yellow亞健康,red病态,叢集健康可以使用 health api 檢視情況
- 叢集狀态監控API:叢集狀态state、叢集統計stats、叢集任務管理_tasks、叢集待處理任務pending_tasks、節點資訊_nodes、活躍線程資訊_nodes/hot_threads、更多叢集api
- 叢集備份:_snapshot、_restore
7.2 Elasticsearch索引基本操作
- 增:put index
- 删:delete index
-
索引資料遷移:
reindex
第三方工具:elasticsearch-dump、Elasticsearch-Exporter、logstash、elasticsearch-migration
- 修改副本數,注意索引一旦建立,分片數不可更改,除非reindex
- 索引壓縮:shrink
- 查:Get index、 get/index/_settings
7.3 Elasticsearch文檔基本操作
-
單個文檔寫入:put document
批量寫入:bulk寫入
第三方導入:1.通過logstash導入多種資料源的資料(關系型資料庫,非關系型資料庫,大資料存儲),2.kafka推送,3.利用flume
-
單個删除:delete document
批量删除:delete-by-query
-
單個修改:update 結合 script
批量修改:update-by-query
-
單個檢索:get
批量檢索:mult get、scroll遊标
- 分頁:from+size
- 高亮:Unified Highlighter(預設)、plain ighlighter、fvh highlighter(适合大檔案)
- 搜尋推薦:Term suggester、Phrase suggester、Completion suggester、Context Suggester
-
分詞:中英文分詞的差別,
中文分詞插件有:ik、jieba、ansj
動态更新詞典政策
- 同義詞詞典配置
- 分析調試:profile:true
7.4 Elasticsearch常用的工具
- kibana工具:xpack提升安全
- Head浏覽器插件
- cerebro監控工具
8 Elasticsearch進階
8.1 Elasticsearch叢集規劃
- 節點數規劃:Master主節點、Client路由節點、data資料節點
- 分片、副本規劃:每個分片支援的資料量、業務資料分類梳理
- 堆記憶體核心原理
- 部署優化:堆記憶體部署優化、線程數/隊列優化設定、候選主節點設定、更新中文分詞詞典
8.2 Elasticsearch資料模組化
- 資料模組化的重要性
- 資料模組化的流程
8.3 Elasticsearch生命周期管理
- 基于時間軸動态建立索引(利用滾動索引和索引模闆)
- 定時清理索引:curator
- 冷熱資料分離
8.4 Elasticsearch寫入性能優化
- Elasticsearch寫入慢的原因:1.沒有使用批量操作,2.使用批量操作,但值設定不合理,3.ES隊列線程池設定不合理
- Elasticsearch寫入提速:1. 采用bulk批量寫入 2. 使用多線程寫入 3. 增加refesh間隔,預設1s,每秒都會将記憶體的資料重新整理到磁盤,如果設為30S,表示30S的資料是寫入記憶體緩存的,30秒才将記憶體的資料重新整理到磁盤 4. 如果搭建ES叢集,禁止refresh和replica,當批量導入大資料時可以禁止副本複制操作 5. 采用自增ID
8.5 Elasticsearch檢索性能優化
-
Elasticsearch檢索慢的原因:
1)索引設定不合理(如所有資料寫入一個固定索引)
2)Mapping映射字段設定不合理
3)DSL設定不合理,有優化空間,如:wildcard
4)傳回字段非常多,如:cont/html_cont
5)慢日志查詢
6)監控叢集狀态:cpu、記憶體、磁盤使用情況判斷是否是硬體原因,确認是否有并行寫入等
-
Elasticsearch檢索提速:
1)先确認哪裡慢了?利用 profile:true 分析
通過在
部分上方提供query
來啟用“profile: true”
。Profile API
GET /ljjtest/book/_search { "profile":"true", "query":{ "match":{ "author":"魯迅" } } }
2)如果是硬體層面,直接擴充硬體
3)資料層面:提前資料模組化、減少檢索字段、Mapping優化、避免使用script、使用近似日期、隻讀資料force_merge、範圍檢索使用keyword而非range
4)緩存方面:使用獨立緩存系統,preference優化緩存使用率
8.6 Elasticsearch磁盤讀寫優化
8.7 Elasticsearch插件開發
9 Elasticsearch實踐
- Elasticsearch日志分析:借助ELK可視化分析
- Elasticsearch全文檢索,做搜尋引擎