ES-索引查詢機制(三)

ES查詢可以分爲兩大類,一類是Get,一類是Search,下面說一下Es內部是怎麼實現的.

一:Get檢索

通過ID檢索特定的Doc

> 查詢的時候是先查詢內存中的TransLog,如果找到就立即返回
> 如果沒找到再查詢磁盤上的TransLog
> 如果還沒有則再去查詢磁盤上的Segment(原始Lucene)

二:Search檢索

通過query查詢來匹配對應的Doc文檔,查詢的時候是一起查詢內存和磁盤上的Segment,最後將結果合併後返回

。其實它有三個對應的實現,默認使用的是第二個,第三個評分準確度最高,但是性能也是最低的,實際使用中需要根據具體的業務需求,選擇對應的檢索階段。

1 query_and_fetch:第一階段查詢到匹配的DocID
2 query_then_fetch:第二階段再查詢DocID對應的完整文檔
3 dfs_query_then_fetch:先收集所有Shard中的TF和DF值,然後將這些值帶入請求中,再次執行query_then_fetch,這樣算分的時候TF和DF就是準確的

三:檢索具體流程

> 實現機制概括

第一階段的Query Phase請求,則會調用SearchService的executeQueryPhase方法

第二階段的Fetch Phase請求,則會調用SearchService的executeFetchPhase方法

> 具體步驟

ClientNode:客戶端節點

Get Remote Cluster Shard:判斷是否需要跨集羣訪問,如果需要,則獲取到要訪問的Shard列表。

Get Search Shard Iterator:獲取當前Cluster中要訪問的Shard,勾出要訪問完整的shard列表

For Every Shard:Perform:遍歷每個Shard,對每個Shard執行後面邏輯

Send Request To Query Shard:將查詢階段請求發送給相應的Shard

Merge Docs:
>> 異步等待返回結果,然後對結果合併
	維護一個Top N大小的優先級隊列,每當收到一個shard的返回,就把結果放入優先級隊列做一次排序,直到所有的Shard都返回。
>>分頁查詢
	search_after
		返回的總數據量只是和Shard個數以及本次需要的個數有關,和歷史已讀取的個數無關
	深度分頁
		通過scroll來實現
			本質類似於遊標
			不能逆行查詢,往返查詢
				只能查詢下一頁

QueryPhase:一階段查詢

Query Phase
	1 Create Search Context
		創建Search Context,之後Search過程中的所有中間狀態都會存在Context中
	 2 Parse Query
		解析Query的Source,將結果存入Search Context
	3 Get From Cache
		判斷請求是否允許被Cache,如果允許,則檢查Cache中是否已經有結果
	4 Add Collectors
		收集查詢結果,實現排序,自定義結果集過濾和收集等
			FilteredCollector
				先判斷請求中是否有Post Filter,Post Filter用於Search,Agg等結束後再次對結果做Filter,希望Filter不影響Agg結果。如果有Post Filter則創建一個FilteredCollector,加入Collector List中。
			PluginInMultiCollector
				判斷請求中是否制定了自定義的一些Collector,如果有,則加入Collector List。
			MinimumScoreCollector
				:判斷請求中是否制定了最小分數閾值,如果指定了,則創建MinimumScoreCollector加入Collector List中,在後續收集結果時,會過濾掉得分小於最小分數的Doc
			EarlyTerminatingCollector
				判斷請求中是否提前結束Doc的Seek,如果是則創建EarlyTerminatingCollector,加入Collector List中。在後續Seek和收集Doc的過程中,當Seek的Doc數達到Early Terminating後會停止Seek後續倒排鏈
			CancellableCollector
				判斷請求中是否提前結束Doc的Seek,如果是則創建EarlyTerminatingCollector,加入Collector List中。在後續Seek和收集Doc的過程中,當Seek的Doc數達到Early Terminating後會停止Seek後續倒排鏈
	5 lucene::search
		調用Lucene中IndexSearch的search接口,執行真正的搜索邏輯
	6 rescore
		根據Request中是否包含rescore配置決定是否進行二階段排序,如果有則執行二階段算分邏輯,會考慮更多的算分因子
	7 suggest::execute()
		如果有推薦請求,則在這裏執行推薦請求
	8 aggregation::execute()
		如果含有聚合統計請求,則在這裏執行

FetchPhase:二階段查詢

Fetch Phase
	當Client Node選擇出最終Top N的結果後,再對最終的Top N讀取Doc內容
		ExplainFetchSubPhase
		DocValueFieldsFetchSubPhase
		ScriptFieldsFetchSubPhase
		FetchSourceSubPhase
		VersionFetchSubPhase
		MatchedQueriesFetchSubPhase
		HighlightPhase
		ParentFieldSubFetchPhase
	通過插件的形式註冊自定義的功能

> 牽涉核心類

SearchPhase
	AggregationPhase
		聚合查詢
	DfsPhase
		三階段查詢
	FetchPhase
		二階段查詢
	QueryPhase
		一階段查詢
	RescorePhase
		二次加分查詢
	SuggestPhase
		推薦查詢

備註:es查詢 默認沒有實現保證全局精準的TF-IDF

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