走近 ElasticSearch (四)——搜索機制與聚合分析

一、前言

走近 ElasticSearch (一)—— 基本概念與架構設計
走近 ElasticSearch (二)—— Document概念、倒排索引原理與分詞
走近 ElasticSearch (三)—— Mapping設計與 Search API 介紹
走近 ElasticSearch (四)—— 搜索機制與聚合分析

二、ES Search 的運行機制

ES的搜索過程如下:在這裏插入圖片描述
看起來很簡單的圖,在我們 ES 集羣中進行搜索,其實並沒有那麼簡單。

1. 搜索過程分解

Search 執行的時候實際分兩個步驟運作的:查詢(Query) 和 獲取(Fetch)

  • 查詢階段(Query Phase):在此階段,協調節點(Coordinating Node)將搜索請求路由到索引(index)中的所有分片(shards)(包括:主要或副本)。分片獨立執行搜索,並根據相關性分數創建一個優先級排序結果。所有分片將匹配的文檔和相關分數的文檔ID返回給協調節點。協調節點創建一個新的優先級隊列,並對全局結果進行排序。可以有很多文檔匹配結果,但默認情況下,每個分片將前10個結果發送到協調節點,協調創建優先級隊列。
  • 獲取階段(Fetch Phase):在協調節點對所有結果進行排序,並通過文檔id,從分片中得到原始文檔,再返回
    在這裏插入圖片描述

2. 再談相關性算分

相關性算分在 shard 與 shard 間是相互獨立的,也就意味着同一個 Term的 IDF等值在不同 shard 上是不同等。文檔的相關性算分和它所處的 shard 相關

所以在文檔數量不多時,會導致相關性算法嚴重不準的情況發生

解決思路有兩個:

  • 1)設置分片數爲1個,從根本上排除問題,在文檔數量不多的時候可以考慮該方案,比如百萬到千萬級別的文檔數量
  • 2)使用DFS Query-then-Fetch 查詢方式:拿到所有文檔後再重新完整的計算一次相關性算法,耗費更多 cpu 和內存,執行性能也比較低下,一般不建議使用。使用方式如下:
GET test_search_relevance/_search?search_type=dfs_query_then_fetch {
  “query”: {
    "match": { "name": "hello" }
  }
}

3. 排序

es 默認會採用相關性算分排序,用戶可以通過設定sorting參數來自行設定排序規則
在這裏插入圖片描述
排序的過程實質是對字段原始內容排序的過程,這個過程中倒排索引無法發揮作用,需要用到正排索引,也就是通過文檔Id和字段可以快速得到字段原始內容。
es 對此提供來2種實現方式:

  • fielddata 默認禁用
  • doc values 默認啓用,除來 text 類型
    在這裏插入圖片描述

4. 分頁與遍歷

es 提供了3種方式來解決分頁與遍歷的問題:from/size、scroll、search_after
在這裏插入圖片描述

  • from/size:存在深度分頁問題。獲取from~size的數據,我們需要把每個Node節點的前size個數據取出來然後排序。所以,頁數越深,處理文檔越多,佔用內存越多,耗時越長
    在這裏插入圖片描述
  • scroll:以快照的方式來避免深度分頁。不能用來做實時搜索。儘量不要使用複雜的 sort 條件
  • search_after:避免深度分頁的性能問題(通過唯一排序值定位將每次要處理的文檔數都控制在 size 內),提供實時的下一頁文檔獲取功能。缺點是不能使用 from 參數,即不能指定頁數,只能下一頁,不能上一頁。
    將50個文檔排序後返回前10個文檔
    在這裏插入圖片描述

三、聚合分析

英文 Aggregation,是 es 除搜索功能外提供的針對 es 數據做統計分析的功能

  • 功能豐富,提供 Bucket、Metric、Pipeline 等多種分析方式,可以滿足大部分的分析需求
  • 實時性高,所有的計算結果都是即時返回的,而 hadoop 等大數據系統一般都是 T + 1 級別的
    在這裏插入圖片描述
    爲了便於理解,es 將聚合分析主要分爲如下 4 類
  • Bucket,分桶類型,類似 SQL 中的 GROUP BY 語法
  • Metric,指標分析類型,如計算最大值、最小值、平均值
  • Pipeline,管道分析類型,基於上一級的聚合分析結果進行再分析
  • Matrix,矩陣分析類型

1. Metric 聚合分析

主要分如下兩類:

  • 單值分析,只輸出一個分析結果:min,max,sum,cardinality
  • 多值分析,輸出多個分析結果:stats,extended stats,percentile,percentile rank,top hits

2. Bucket 聚合分析

Bucket,意爲桶,即按照一定的規則將文檔分配到不同的桶中,達到分類分析的目的。
按照 Bucket 的分桶策略,常見的 Bucket 聚合分析如:Terms、Range、Date、Range、Histogram

3. Bucket + Metric 聚合分析

分桶之後在分桶
在這裏插入圖片描述

4. Pipeline 聚合分析

針對聚合分析的結果再次進行聚合分析,而且支持鏈式調用

5. 作用範圍

es 聚合分析默認作用範圍是 query 的結果集,可以通過這些的方式改變其作用範圍:filter、post_filter、global
在這裏插入圖片描述

6. Terms 並不永遠準確

在這裏插入圖片描述
解決辦法:

  • 設置 Shard 數爲1,消除數據分散的問題,但無法承載大數據量
  • 合理設置 Shard_Size 大小,即每次從 SHard 上額外多獲取數據,以提升準確度
    在這裏插入圖片描述

四、參考

Elasticsearch詞頻統計實現與原理解讀

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章