1. 程式人生 > >elasticsearch搜尋過程分析

elasticsearch搜尋過程分析

(一)通過HTTP請求調用搜索服務
示例:

GET http://localhost:9200/index_test/_search
{
   "query": {
       "query_string": {
          "default_field": "title",
          "query": "this is title field"
       }
   }
}

(二)相關說明
1、搜尋型別
query_then_fetch/dfs_query_then_fetch:預設是query_then_fetch搜尋,現在5.3.1版本只有這兩種搜尋型別(SearchType列舉類)
query_and_fetch/dfs_query_and_fetch:內部搜尋優化,不支援REST呼叫,現已移除
2、主要協議
indices:admin/shards/search_shards
indices:data/read/search
indices:data/read/search[phase/query]:query階段
indices:data/read/search[phase/fetch/id]:fetch階段
3、主要服務類
TransportSearchAction
SearchQueryThenFetchAsyncAction
SearchDfsQueryThenFetchAsyncAction
SearchTransportService
SearchPhaseController
SearchService
QueryPhase
FetchPhase
OperationRouting
(三)具體搜尋的過程
  1、HTTP到TCP的呼叫鏈:
RestController -> RestSearchAction -> TransportClient -> TransportSearchAction.doExecute(task,request,listener);
  searchRequestBuilder.execute()呼叫鏈:
TransportClient -> TransportSearchAction.doExecute(task,request,listener)
  2、 如果有跨叢集搜尋,按照不同的叢集將請求中的索引分組,然後通過RemoteClusterService的collectSearchShards方法針對每個叢集將搜尋請求傳送出去,目標叢集TransportSearchAction收到請求呼叫doExecute方法處理。本示例只搜尋一個叢集中的一個索引,沒有分組,呼叫executeSearch方法直接處理
  3、解析索引別名關聯的過濾器;獲取請求中的routing路由引數資訊;
  4、OperationRouting計算目標Shard列表
   4.1、首先從ClusterState叢集路由表IndexRoutingTable中獲取所有IndexShardRoutingTable,每個IndexShardRoutingTable存有一個分片所有相關資訊,包括其主分片和副本的,執行中的和未分配的等等(本示例是1個主分片4個副本,所以只有一個IndexShardRoutingTable)
   4.2、遍歷IndexShardRoutingTable列表,計算IndexShardRoutingTable中該次請求應該訪問的具體Shard
    4.3、檢視本次請求是否有preference引數,可根據使用者引數請求只搜尋主分片、只搜尋副本、搜尋特定Shard、搜尋指定Node等,有的話根據preference引數選擇特定的節點和分片:
    4.4、沒有指定preference引數,根據IndexShardRoutingTable路由表處理:優先選擇執行中的Shard,其次是遷移中的Shard,通過AtomicInteger維護一個計數器,每次加1,對Shard列表取餘,本質是一個輪詢的演算法,需要查詢特定的Shard列表封裝到GroupShardsIterator迭代器中,後面會檢查查詢的Shard數量是否超過限制,過多的Shard查詢非常影響效能,所以預設上限1000個
  5、解析索引的boost加權引數;如果只查詢一個Shard或者只進行搜尋建議查詢,將搜尋型別置為query_then_fetch,因為一個Shard沒有必要再走dfs_query_then_fetch
  6、根據搜尋型別的不同構造不同的action例項,query_then_fetch為SearchQueryThenFetchAsyncAction,dfs_query_then_fetch為SearchDfsQueryThenFetchAsyncAction,處於效率效能等方面的考慮,一般用query_then_fetch查詢
  7、SearchQueryThenFetchAsyncAction呼叫start方法處理,迭代GroupShardsIterator,針對每個Shard,呼叫performInitialPhase方法開始第一階段的搜尋處理,與目標Shard的Node建立連線,通過SearchTransportService的sendExecuteQuery將請求(indices:data/read/search[phase/query])傳送出去,如果請求的Shard只有一個,該階段就獲取Document文件,通過QueryFetchSearchResult儲存搜尋結果,其他情況不會自動獲取Document,通過QuerySearchResult儲存搜尋結果;請求處理類在SearchTransportService類中註冊,為TaskAwareTransportRequestHandler類,TaskAwareTransportRequestHandler收到請求後呼叫SearchService的executeQueryPhase方法處理第一階段的query
  8、為ShardSearchTransportRequest請求建立DefaultSearchContext上下文物件,DefaultSearchContext存有請求引數、搜尋結果、Shard資訊、統計等等跟本次搜尋相關的所有資訊;SearchService呼叫loadOrExecuteQueryPhase方法,首先判斷該次請求是否可被快取(根據請求引數、es配置、query_then_fetch搜尋型別、size是否為0等判斷),可以的話就從快取中載入資料,呼叫IndicesService的loadIntoContext方法將資料載入到context上下文物件中,沒有快取資料呼叫QueryPhase的execute(searchContext)方法走正常搜尋流程;主要分為查詢、重新打分、搜尋提示、聚合四個子流程
   8.1、查詢
  確定獲取的文件數,為總文件數和from+size的較小值,例如每頁10條,檢索第2頁的資料,需要查詢出20條,排序將10-19編號返回
  確定Lucene Collector文件收集器物件,Collector負責收集命中的TopDocs文件,可以定製不同的Collector進行個性化的排序、過濾等,根據請求的不同使用不同的Collector型別,比如TopDocsCollector( TopDocs文件收集器的基類,通過PriorityQueue優先順序佇列儲存top n資料)、TopScoreDocCollector(ScoreDoc文件收集器的基類,ScoreDoc是TopDocs中的一條資料,預設按score降序排列,score相同則按id升序排列)、TotalHitCountCollector(只獲取相關文件數時用)、ProfileCollector(統計時間開銷,類似Java的IO流類,可以裝飾別的Collector)、TimeLimitingCollector(根據設定的閾值及時停止耗時的操作,預設配置search.default_search_timeout為-1,即不超時,同樣可裝飾別的Collector),CancellableCollector(elasticsearch定製,可取消查詢)等,本示例是SimpleTopScoreDocCollector(TopScoreDocCollector的例項);如果需要獲取執行時間統計資訊,用InternalProfileCollector包裝SimpleTopScoreDocCollector;讓查詢可被取消用CancellableCollector進行包裝
  在構造Collector的過程中,主要涉及scroll滾動、collapse欄位摺疊、post filter過濾器、超時collector等邏輯處理
呼叫IndexSearcher.search(query, collector)交給Lucene進行查詢,隨後從collector中得到TopDocs資料,放到QuerySearchResult或QueryFetchSearchResult中
接下來如果需要還要進行重新打分,搜尋提示和聚合操作的處理
   8.2、重新打分
   8.3、搜尋提示
   8.4、聚合
  9、每次查詢執行成功後,AtomicInteger計數器加1,所有Shard查詢請求處理完成之後:如果只牽扯到單個Shard,直接呼叫SearchService的executeFetchPhase進行處理,首先確定需要載入文件資料的doc id,區間為[from,from+size),放到context中;
其它情況Listener回撥觸發SearchQueryThenFetchAsyncAction內部類FetchPhase的run方法:
  SearchPhaseController對獲取到的ScoreDoc陣列進行排序,取得特定區間的ScoreDoc([from,from+size))
  對ScoreDoc按Shard分組,hppc類庫IntArrayList[]儲存結構,IntArrayList存有一個Shard到一個或多個docId的對映
  針對每個Shard傳送fetch請求,每次返回結果收集到CountedCollector中,全部結果返回後呼叫sendResponseAsync方法非同步執行合併操作得到InternalSearchResponse並給使用者返回結果
  合併多個fetch資料主要是SearchPhaseController的merge方法,主要合併搜尋提示、聚合、統計等資訊
  10、fetch階段主處理流程為FetchPhase的execute(context)方法
檢查context中的StoredFieldsContext(存有配置store=yes的field欄位資訊)、ScriptFieldsContext(利用painless,groovy等指令碼處理的script_fields欄位)、FetchSourceContext(如果沒有前兩個context,預設載入source欄位資料),FieldsVisitor存有需要載入的store欄位資訊,內建的預設載入欄位主要有_routing、_ttl、_parent、_timestamp、_source、_uid
  確定需要載入的欄位後,對於每一個docId,載入位元組資料到FieldVisitor中,context的SearchLookup解析得到所有欄位的資料,得到了InternalSearchHit物件,但是現在很多欄位資料都沒有填充,只有id,type等資訊
  接下來是9個子階段的處理,下面都是FetchSubPhase介面的實現類,每個InternalSearchHit都會被這些FetchSubPhase處理一遍,每個實現類負責不同的資料組裝

ExplainFetchSubPhase :打分解釋說明
DocValueFieldsFetchSubPhase :doc value欄位的資料,比如 "docvalue_fields": ["field1", "field2"]
ScriptFieldsFetchSubPhase :script欄位資料
FetchSourceSubPhase :從上述SourceLookup中獲取source欄位資料填充到hit中
VersionFetchSubPhase :文件的version資訊
InnerHitsFetchSubPhase:inner hits 資料填充
HighlightPhase :高亮資訊
PercolatorHighlightSubFetchPhase:繼承HighlightPhase ,根據文件得到符合要求的查詢為Percolator查詢(正常查詢的逆過程),高亮單獨處理
ParentFieldSubFetchPhase :父子文件中父文件資訊

  最後InternalSearchHit[]陣列物件還有2個子階段的處理

PercolatorHighlightSubFetchPhase :為每個InternalSearchHit填充高亮資訊MatchedQueriesFetchSubPhase :為每個InternalSearchHit獲取匹配到的查詢名稱

  11、query和fetch處理完成,返回相關文件資料

  12、文件資料

相關推薦

elasticsearch搜尋過程分析

(一)通過HTTP請求調用搜索服務 示例: GET http://localhost:9200/index_test/_search { "query": { "query_string": { "default_

elasticsearch 搜尋過程

https://www.elastic.co/guide/en/elasticsearch/reference/5.6/search-request-search-type.html#dfs-query-then-fetch 查詢型別(引數search_type指定):(一

Elasticsearch High Level Rest Client 發起請求的過程分析

本文討論的是JAVA High Level Rest Client向ElasticSearch6.3.2傳送請求(index操作、update、delete……)的一個詳細過程的理解,主要涉及到Rest Client如何選擇哪一臺Elasticsearch伺服器發起請求。 maven依賴如下: <d

大資料篇:Elasticsearch分散式搜尋分析引擎

Elasticsearch簡介 Elasticsearch是一個實時的分散式搜尋和分析引擎。它可以幫助你用前所未有的速度去處理大規模資料。 它可以用於全文搜尋,結構化搜尋以及分析,當然你也可以將這三者進行組合。 Elasticsearch是一個建立在全文搜尋引擎 Apa

Elasticsearch 5.6.12 原始碼】——【3】啟動過程分析(下)

版權宣告:本文為博主原創,轉載請註明出處! 簡介 本文主要解決以下問題: 1、ES啟動過程中的Node物件都初始化了那些服務? 構造流程 Step 1、建立一個List暫存初始化失敗時需要釋放的資源,並使用臨時的Logger物件輸出開始初始化的日誌。 這裡首先建立了一個List

Elasticsearch 5.6.12 原始碼】——【2】啟動過程分析(上)

版權宣告:本文為博主原創,轉載請註明出處! 簡介 本文主要解決以下問題: 1、啟動ES的入口類及入口方法是哪個?2、分析梳理ES服務啟動的主要流程? 入口類 ES的入口類為org.elasticsearch.bootstrap.Elasticsearch,啟動方法為: public

elasticsearch分詞檢索的match-query匹配過程分析

1. 模擬字串資料儲存localhost:9200/yigo-redist.1/_analyze?analyzer=default&text=全能片(前)---TRW-GDB7891AT剎車片自帶報警線,無單獨報警線號碼,卡仕歐,卡仕歐,乘用車,剎車片    索引為`

elasticsearch document的索引過程分析

elasticsearch專欄:https://www.cnblogs.com/hello-shf/category/1550315.html   一、預備知識 1.1、索引不可變 看到這篇文章相信大家都知道es是倒排索引,不瞭解也沒關係,在我的另一篇博文中詳細分析了es的倒排索引機制。在e

【docker Elasticsearch】Rest風格的分散式開源搜尋分析引擎Elasticsearch初體驗

目錄 概述: 2、問題 二:安裝kibana 1、安裝 2、問題 貳:Elastic search初體驗 一:新增資料

【轉】Android 4.0 Launcher2源碼分析——啟動過程分析

handler flag 這一 第一次啟動 asynctask pla size ontouch wait Android的應用程序的入口定義在AndroidManifest.xml文件中可以找出:[html] <manifest xmlns:android="htt

STM32的flash數據頁轉存過程分析

pty val 根據 mst else 系統 add ted ble stm32模擬eeprom要實現flash數據頁轉存,實現函數為 1 /** 2 * @brief Transfers last updated variables data from the fu

Linux系統調用過程分析

policy 用戶空間 抽象接口 保護 name ack for 內嵌 驅動程序 參考: 《Linux內核設計與實現》 0 摘要 linux的系統調用過程: 層次例如以下: 用戶程序------>C庫(即API):INT 0x80 ----->system_

X86架構下Linux啟動過程分析

重要 ack csdn 檢查 point article span 註意 eap 1、X86架構下的從開機到Start_kernel啟動的整體過程 這個過程簡要概述為: 開機——>BIOS——>GRUB/LILO——>Linux Kernel

Linux開機啟動過程分析

物理內存 登錄 page thread 陷阱門 execute 啟動過程 font 定義 Linux開機啟動過程分析 開機過程指的是從打開計算機電源直到LINUX顯示用戶登錄畫面的全過程。分析LINUX開機過程也是深入了解LINUX核心工作原理的一個很好的途徑。 啟動第一

轉 A10/A20 Bootloader加載過程分析

轉換 開發 title modules 上電 invalid 添加 i/o github A10/A20 Bootloader加載過程分析 註:由於全誌A10和A20在加載Bootloader過程方面基本一致,下面僅以A20敘述,但同時也適用於A10。另外在不需要區分Cu

elasticsearch源碼分析之search模塊(client端)

源碼 工作 www 搜索 earch rtp bin code nbsp elasticsearch源碼分析之search模塊(client端) 註意,我這裏所說的都是通過rest api來做的搜索,所以對於接收到請求的節點,我姑且將之稱之為client端,其主要的功能

u-boot-201611 啟動過程分析——基於smdk2410

u-bootu-boot-201611 啟動過程分析——基於smdk2410

OTA升級包制作工具處理過程分析

host ext updater 解析 misc dsm 應該 增量升級 預處理 http://blog.csdn.net/ly890700/article/details/56048815 Android Recovery(30) 1、概述 OTA升

elasticsearch aggregation 過程(未完)

elasticsearch aggregation 過程在查詢過程中,ES是將整個查詢分成幾個階段的,大體如下:QueryPhaserescorePhasesuggestPhaseaggregationPhaseFetchPhase對於全文檢索,可能還有DFSPhase。從源代碼QueryPhase 類可以看

linux 系統啟動過程分析

系統root 密碼丟失故障 linux啟動順序主板BIOS加電自檢 檢查硬件--> 讀取硬盤引導扇區(MBR)--> 啟動引導程序(grub)--> 選擇系統--> 加載系統內核(kernel shell)--> 啟動系統讀取相應的默認設置(環境變量,運行級別)--