ES 索引查詢機制 三

2021-09-27 08:53:27 字數 3275 閱讀 5160

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

ES 二 索引的查詢更新刪除

單個索引查詢 test public void queryindex 結果 org.elasticsearch.transport.client.prebuilttransportclient 783ec989 需要注釋掉之前獲取客戶端物件的client.close 方法 多個條件的查詢 test ...

ES的建立索引,刪除查詢等

在hive建立es表 lp能力查詢 post clue strategies lp ability lp ability search?pretty from 0,size 5600 查5條 get clue strategies lp ability lp ability search?prett...

ES基礎語法之索引 基礎查詢

rror 02 12 23.167 error reporting timeouterror waiting for target failed timeout 30000ms exceeded at function.waitwithtimeout opt es7 kibana 7.5.2 lin...