ES查詢內(nèi)核流程

      網(wǎng)友投稿 987 2022-05-29

      1???? 概述

      ES查詢分為GET和SEARCH兩類,GET查詢指定_index,_type,_id,從正排索引中獲取指定Doc。SEARCH查詢不指定_id,根據(jù)關(guān)鍵字從倒排索引中獲取內(nèi)容。以下主要分析SEARCH過(guò)程:

      (1)??? SEARCH過(guò)程分為兩個(gè)階段:Query和Fetch。

      (2)??? SEARCH過(guò)程涉及兩類節(jié)點(diǎn):協(xié)調(diào)節(jié)點(diǎn)和數(shù)據(jù)節(jié)點(diǎn)。

      Query階段客戶端將請(qǐng)求發(fā)送給協(xié)調(diào)節(jié)點(diǎn),協(xié)調(diào)節(jié)點(diǎn)將請(qǐng)求轉(zhuǎn)發(fā)到數(shù)據(jù)節(jié)點(diǎn)上索引的每個(gè)主分片或副本分片中,每個(gè)分片在本地執(zhí)行查詢,并進(jìn)行打分,添加結(jié)果到大小為from+size的本地有序優(yōu)先隊(duì)列中。每個(gè)分片返回各自優(yōu)先隊(duì)列中所有文檔的ID和排序值給協(xié)調(diào)節(jié)點(diǎn),協(xié)調(diào)節(jié)點(diǎn)合并這些值到自己的優(yōu)先隊(duì)列中,產(chǎn)生一個(gè)全局排序后的列表。

      Fetch階段根據(jù)Query階段的結(jié)果,協(xié)調(diào)節(jié)點(diǎn)向相關(guān)數(shù)據(jù)節(jié)點(diǎn)發(fā)送GET請(qǐng)求,分片所在節(jié)點(diǎn)向協(xié)調(diào)節(jié)點(diǎn)返回?cái)?shù)據(jù),協(xié)調(diào)節(jié)點(diǎn)等待所有文檔被取得,然后返回給客戶端。

      ES查詢內(nèi)核流程

      2???? 源碼分析

      2.1????? 協(xié)調(diào)節(jié)點(diǎn)流程

      2.1.1??????? Query階段:

      1.解析請(qǐng)求

      RestSearchAction#prepareRequest方法中將請(qǐng)求體解析為SearchRequest數(shù)據(jù)結(jié)構(gòu):

      2.構(gòu)造目的shard列表

      將請(qǐng)求涉及的本集群shard列表和遠(yuǎn)程集群的shard列表合并,TransportSearchAction#executeSearch完成了合并操作,調(diào)用了mergeShardIterators:

      3.遍歷所有shard發(fā)送請(qǐng)求

      請(qǐng)求是基于shard遍歷的,如果列表中有N個(gè)shard位于同一個(gè)節(jié)點(diǎn),則向其發(fā)送N次請(qǐng)求。AbstractSearchAsyncAction#run完成此操作,????????performPhaseOnShard發(fā)送請(qǐng)求:

      4.收集返回結(jié)果

      AbstractSearchAsyncAction#onShardResult完成收集操作,consumeResult對(duì)收集的結(jié)果進(jìn)行合并:

      successfulShardException檢查是否所有請(qǐng)求都已收到回復(fù),是否進(jìn)入下一階段:

      以上方法調(diào)用的OnPhaseDone方法會(huì)調(diào)用executeNextPhase,從而開始執(zhí)行Fetch取回階段。

      2.1.2? ? ? ??Fetch階段:

      1.???? 發(fā)送Fetch請(qǐng)求

      Query階段的executeNextPhrase方法觸發(fā)Fetch階段,F(xiàn)etch階段的起點(diǎn)為FetchSearchPharse#innerRun函數(shù),再進(jìn)一步調(diào)用executeFetch方法,從查詢階段的shard列表中遍歷來(lái)獲取數(shù)據(jù)。

      executeFetch的主要實(shí)現(xiàn):

      executeFetch中定義一個(gè)Listener,每成功獲取一個(gè)shard數(shù)據(jù)后就執(zhí)行counter.onResult,其中調(diào)用對(duì)結(jié)果的處理回調(diào),把result保存到數(shù)組中,然后執(zhí)行countDown:

      2.???? 收集結(jié)果

      收集器定義在innerRun中,包括收到的shard數(shù)據(jù)存放在哪里,收集完成后誰(shuí)來(lái)處理:

      fetchResults用于存儲(chǔ)從某個(gè)shard收集到的結(jié)果,每收到一個(gè)shard的數(shù)據(jù)就執(zhí)行一次counter.countDown。當(dāng)所有shard數(shù)據(jù)收集完畢后,countDown會(huì)觸發(fā)執(zhí)行finishPhase:

      moveToNextPhase方法執(zhí)行下一階段,下一階段要執(zhí)行的任務(wù)定義在FetchSearchPhase構(gòu)造函數(shù)中,主要是觸發(fā)ExpandSearchPharse,取回階段完成之后執(zhí)行ExpandSearchPharse#run,主要判斷是否啟用字段疊加,根據(jù)需要實(shí)現(xiàn)字段疊加功能。

      3.???? 回復(fù)客戶端

      ExpandSearchPharse執(zhí)行完之后回復(fù)客戶端,在sendResonsePharse方法中實(shí)現(xiàn):

      2.3? ? ??數(shù)據(jù)節(jié)點(diǎn)流程

      2.2.1??????? 響應(yīng)Query請(qǐng)求

      主要過(guò)程就是執(zhí)行查詢,然后發(fā)送Response。Query,F(xiàn)etch請(qǐng)求的處理入口注冊(cè)于SearchTransportService#registerRequestHandler:

      查詢?nèi)肟谠趕earchService.executeQueryPhase中。查詢時(shí),先看是否允許cache,由以下配置決定:

      index.requests.cache.enable

      默認(rèn)為true,會(huì)把查詢結(jié)果放到cache中,查詢時(shí)優(yōu)先從cache中取。這個(gè)cache由節(jié)點(diǎn)的所有分片共享,基于LRU算法實(shí)現(xiàn):空間滿的時(shí)候刪除最近最少使用的數(shù)據(jù)。所以cache并不緩存全局檢索結(jié)果。

      核心的查詢封裝在queryPhase.execute(context)中,其中調(diào)用Lucene實(shí)現(xiàn)檢索,同時(shí)實(shí)現(xiàn)聚合:

      其中包含幾個(gè)核心功能:

      executeInternal():調(diào)用Lucene的searcher.search()實(shí)現(xiàn)搜索;

      rescoreRhase:全文檢索且需要打分;

      suggestPhase:自動(dòng)補(bǔ)全及糾錯(cuò);

      aggregationPhase:實(shí)現(xiàn)聚合。

      2.2.2? ? ? ??響應(yīng)Fetch請(qǐng)求

      主要過(guò)程是執(zhí)行Fetch,然后發(fā)送Response:

      對(duì)Fetch響應(yīng)的實(shí)現(xiàn)封裝在searchService.executeFetrchPhase中,核心是調(diào)用fetchPhase.execute(context)。按照命中的doc取得相關(guān)數(shù)據(jù),填充到SearchHits中,最終封裝到FetchSearchResult中

      Elasticsearch

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:技術(shù)解析+代碼實(shí)戰(zhàn),帶你入門華為云政務(wù)區(qū)塊鏈平臺(tái)
      下一篇:開發(fā)一個(gè)社區(qū)網(wǎng)站,只要20分鐘?小白也能輕松掌握云上敏捷開發(fā)
      相關(guān)文章
      一本色道久久综合亚洲精品高清| 亚洲人成伊人成综合网久久| 国产AV旡码专区亚洲AV苍井空| 国产亚洲精品岁国产微拍精品| 国产91精品一区二区麻豆亚洲| 国产精品亚洲天堂| 亚洲日本中文字幕天天更新| 中文字幕亚洲情99在线| 亚洲不卡在线观看| 亚洲AV综合色区无码二区爱AV| 亚洲成a人片在线观| 亚洲成人福利在线| 亚洲天堂一区二区三区四区| 亚洲欧洲国产精品久久| 亚洲欧洲日产国码二区首页| 亚洲国产成人精品无码区在线秒播| 亚洲成AV人综合在线观看| 久久亚洲AV无码精品色午夜 | 亚洲国产精品自在在线观看| 亚洲AV无码一区东京热久久| 久久91亚洲精品中文字幕| 亚洲av福利无码无一区二区| 亚洲丝袜美腿视频| 亚洲视频欧洲视频| 亚洲国产日韩在线人成下载| 激情亚洲一区国产精品| 亚洲视频一区二区三区四区| 在线精品亚洲一区二区| 亚洲高清毛片一区二区| 国产亚洲蜜芽精品久久| 亚洲午夜日韩高清一区| 亚洲乱码精品久久久久..| 亚洲AV无码码潮喷在线观看| 亚洲免费在线视频| 亚洲国产精品无码久久久| 香蕉大伊亚洲人在线观看| 亚洲风情亚Aⅴ在线发布| 亚洲精品国产电影| 久久九九亚洲精品| 亚洲性天天干天天摸| 亚洲性一级理论片在线观看|