天天看點

Elasticsearch知識點1 什麼是Elasticsearch?2 Elasticsearch的特點3 Elasticsearch基礎概念4 Elasticsearch基本資料類型(看這裡)5 Elasticsearch基本檢索類型6 Elasticsearch基本基本聚合類型7 Elasticsearch基本操作類型8 Elasticsearch進階9 Elasticsearch實踐

目錄

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基本資料類型(看這裡)

Elasticsearch知識點1 什麼是Elasticsearch?2 Elasticsearch的特點3 Elasticsearch基礎概念4 Elasticsearch基本資料類型(看這裡)5 Elasticsearch基本檢索類型6 Elasticsearch基本基本聚合類型7 Elasticsearch基本操作類型8 Elasticsearch進階9 Elasticsearch實踐

5 Elasticsearch基本檢索類型

5.1 檢索和過濾

  1. 檢索和過濾的差別(看這裡)
  2. 檢索和過濾的适用場景,針對他們的差別可以确定各自的使用場景

5.2 結構化檢索

  1. 精确比對檢索:term查詢單值精确比對、terms查詢多值精确比對,terms_set多值比對并且可以定義傳回文檔所需的比對術語數
  2. 範圍檢索:range query(低版本用 range filter)
  3. 存在與否檢索:exists query
  4. 字首查詢:prefix query
  5. 通配符檢索:wildcard query
  6. 正則檢索:regexp query
  7. 類型檢索:type query
  8. id檢索:ids query
  9. 模糊查詢:fuzzy query,與通配符查詢類似,但是fuzzy查詢,當搜尋條件是個不準确的單詞或詞時,可以自動幫助糾正後查詢

5.3 全文檢索

  1. 分詞全文檢索:match
  2. 布爾字首檢索:match_bool_prefix
  3. 短語檢索:match_phrase 
  4. 短語字首檢索:match_phrase_prefix 
  5. 多字段比對檢索:multi_match 
  6. 支援與或非的字元串檢索:query_string
  7. 簡化的字元串檢索:simple_query_string 
  8. 間隔檢索:intervals 

5.4 複合檢索

  1. 固定得分檢索 看這裡
  2. bool組合檢索:must、should(通過minimum_should_match指定比對的個數)、must_not、filter 看這裡
  3. 改變評分檢索:boosting、function score、dis max query

5.5 特定檢索

  1. 嵌套檢索:nested query
  2. 父子檢索:has_child query、has_parent query、parent_id query
  3. 地理檢索:geo 查詢 和 distance_feature query(查詢更接近提供的

    origin

    日期或時間點的資料。或者查詢來查找某個位置最近的鄰居)
  4. 相似文檔檢索:more_like_this
  5. 腳本檢索:script query

6 Elasticsearch基本基本聚合類型

6.1 Metric聚合

  1. 去重統計:cardinality
  2. 平均統計:Avg
  3. 最大和最小統計:Max、Min
  4. 求和統計:Sum
  5. 統計彙總:Stats(包含平均值、最大最小值、總數)
  6. 更多

6.2 Buckting聚合

  1. terms按字段分組統計:terms
  2. 根據字段值統計:histogram
  3. 根據時間值統計:datehistogram
  4. 根據時間段統計:daterange(可以指定時間段格式和具體查詢的時間區間)
  5. 過濾Filter聚合:filter 和 filters
  6. 嵌套聚合:nested
  7. 更多

6.3 Pipeline聚合

  1. bucked script聚合:bucket script
  2. bucked selector聚合:bucket selector
  3. bucked sort聚合:bucket sort
  4. Avg/Max/Min/Sum bucked聚合
  5. 更多

7 Elasticsearch基本操作類型

7.1 Elasticsearch叢集基本操作

  1. 叢集健康狀态分類:green健康,yellow亞健康,red病态,叢集健康可以使用 health api 檢視情況
  2. 叢集狀态監控API:叢集狀态state、叢集統計stats、叢集任務管理_tasks、叢集待處理任務pending_tasks、節點資訊_nodes、活躍線程資訊_nodes/hot_threads、更多叢集api
  3. 叢集備份:_snapshot、_restore

7.2 Elasticsearch索引基本操作

  1. 增:put index
  2. 删:delete index
  3. 索引資料遷移:

    reindex

    第三方工具:elasticsearch-dump、Elasticsearch-Exporter、logstash、elasticsearch-migration

  4. 修改副本數,注意索引一旦建立,分片數不可更改,除非reindex
  5. 索引壓縮:shrink
  6. 查:Get index、 get/index/_settings

7.3 Elasticsearch文檔基本操作

  1. 單個文檔寫入:put document

    批量寫入:bulk寫入

    第三方導入:1.通過logstash導入多種資料源的資料(關系型資料庫,非關系型資料庫,大資料存儲),2.kafka推送,3.利用flume

  2. 單個删除:delete document

    批量删除:delete-by-query

  3. 單個修改:update 結合 script

    批量修改:update-by-query

  4. 單個檢索:get

    批量檢索:mult get、scroll遊标

  5. 分頁:from+size
  6. 高亮:Unified Highlighter(預設)、plain ighlighter、fvh highlighter(适合大檔案)
  7. 搜尋推薦:Term suggester、Phrase suggester、Completion suggester、Context Suggester
  8. 分詞:中英文分詞的差別,

    中文分詞插件有:ik、jieba、ansj

    動态更新詞典政策

  9. 同義詞詞典配置
  10. 分析調試:profile:true

7.4 Elasticsearch常用的工具

  1. kibana工具:xpack提升安全
  2. Head浏覽器插件
  3. cerebro監控工具

8 Elasticsearch進階

8.1 Elasticsearch叢集規劃

  • 節點數規劃:Master主節點、Client路由節點、data資料節點
  • 分片、副本規劃:每個分片支援的資料量、業務資料分類梳理
  • 堆記憶體核心原理
  • 部署優化:堆記憶體部署優化、線程數/隊列優化設定、候選主節點設定、更新中文分詞詞典

8.2 Elasticsearch資料模組化

  • 資料模組化的重要性
  • 資料模組化的流程

8.3 Elasticsearch生命周期管理

  • 基于時間軸動态建立索引(利用滾動索引和索引模闆)
  • 定時清理索引:curator
  • 冷熱資料分離

8.4 Elasticsearch寫入性能優化

  1. Elasticsearch寫入慢的原因:1.沒有使用批量操作,2.使用批量操作,但值設定不合理,3.ES隊列線程池設定不合理
  2. Elasticsearch寫入提速:1. 采用bulk批量寫入 2. 使用多線程寫入 3. 增加refesh間隔,預設1s,每秒都會将記憶體的資料重新整理到磁盤,如果設為30S,表示30S的資料是寫入記憶體緩存的,30秒才将記憶體的資料重新整理到磁盤 4. 如果搭建ES叢集,禁止refresh和replica,當批量導入大資料時可以禁止副本複制操作 5. 采用自增ID

8.5 Elasticsearch檢索性能優化

  1. Elasticsearch檢索慢的原因:

    1)索引設定不合理(如所有資料寫入一個固定索引)

    2)Mapping映射字段設定不合理

    3)DSL設定不合理,有優化空間,如:wildcard

    4)傳回字段非常多,如:cont/html_cont

    5)慢日志查詢

    6)監控叢集狀态:cpu、記憶體、磁盤使用情況判斷是否是硬體原因,确認是否有并行寫入等

  2. 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實踐

  1. Elasticsearch日志分析:借助ELK可視化分析
  2. Elasticsearch全文檢索,做搜尋引擎

繼續閱讀