1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        ES 查詢數(shù)據(jù)的工作原理是什么?

        共 5177字,需瀏覽 11分鐘

         ·

        2020-08-09 02:20


        點擊上方藍色“程序猿DD”,選擇“設為星標”

        回復“資源”獲取獨家整理的學習資料!

        來源 |?http://8rr.co/GsAa

        面試題

        ES 寫入數(shù)據(jù)的工作原理是什么???ES 查詢數(shù)據(jù)的工作原理是什么???底層的 Lucene 介紹一下唄?倒排索引了解嗎?

        面試官心理分析

        問這個,其實面試官就是要看看你了解不了解 es 的一些基本原理,因為用 es 無非就是寫入數(shù)據(jù),搜索數(shù)據(jù)。你要是不明白你發(fā)起一個寫入和搜索請求的時候,es 在干什么,那你真的是......

        對 es 基本就是個黑盒,你還能干啥?你唯一能干的就是用 es 的 api 讀寫數(shù)據(jù)了。要是出點什么問題,你啥都不知道,那還能指望你什么呢?

        面試題剖析

        es 寫數(shù)據(jù)過程

        • 客戶端選擇一個 node 發(fā)送請求過去,這個 node 就是?coordinating node?(協(xié)調(diào)節(jié)點)。
        • coordinating node?對 document 進行路由,將請求轉發(fā)給對應的 node(有 primary shard)。
        • 實際的 node 上的?primary shard?處理請求,然后將數(shù)據(jù)同步到?replica node?。
        • coordinating node?如果發(fā)現(xiàn)?primary node?和所有?replica node?都搞定之后,就返回響應結果給客戶端。
        es-write

        es 讀數(shù)據(jù)過程

        可以通過?doc id?來查詢,會根據(jù)?doc id?進行 hash,判斷出來當時把?doc id?分配到了哪個 shard 上面去,從那個 shard 去查詢。

        • 客戶端發(fā)送請求到任意一個 node,成為?coordinate node?。
        • coordinate node?對?doc id?進行哈希路由,將請求轉發(fā)到對應的 node,此時會使用?round-robin?隨機輪詢算法,在?primary shard?以及其所有 replica 中隨機選擇一個,讓讀請求負載均衡。
        • 接收請求的 node 返回 document 給?coordinate node?。
        • coordinate node?返回 document 給客戶端。

        es 搜索數(shù)據(jù)過程

        es 最強大的是做全文檢索,就是比如你有三條數(shù)據(jù):

        java真好玩兒啊
        java好難學啊
        j2ee特別牛Copy?to?clipboardErrorCopied

        你根據(jù)?java?關鍵詞來搜索,將包含?java?的?document?給搜索出來。es 就會給你返回:java真好玩兒啊,java好難學啊。

        • 客戶端發(fā)送請求到一個?coordinate node?。
        • 協(xié)調(diào)節(jié)點將搜索請求轉發(fā)到所有的 shard 對應的?primary shard?或?replica shard?,都可以。
        • query phase:每個 shard 將自己的搜索結果(其實就是一些?doc id?)返回給協(xié)調(diào)節(jié)點,由協(xié)調(diào)節(jié)點進行數(shù)據(jù)的合并、排序、分頁等操作,產(chǎn)出最終結果。
        • fetch phase:接著由協(xié)調(diào)節(jié)點根據(jù)?doc id?去各個節(jié)點上拉取實際的?document?數(shù)據(jù),最終返回給客戶端。

        寫請求是寫入 primary shard,然后同步給所有的 replica shard;讀請求可以從 primary shard 或 replica shard 讀取,采用的是隨機輪詢算法。

        寫數(shù)據(jù)底層原理

        es-write-detail

        先寫入內(nèi)存 buffer,在 buffer 里的時候數(shù)據(jù)是搜索不到的;同時將數(shù)據(jù)寫入 translog 日志文件。

        如果 buffer 快滿了,或者到一定時間,就會將內(nèi)存 buffer 數(shù)據(jù)?refresh?到一個新的?segment file?中,但是此時數(shù)據(jù)不是直接進入?segment file?磁盤文件,而是先進入?os cache?。這個過程就是?refresh?。

        每隔 1 秒鐘,es 將 buffer 中的數(shù)據(jù)寫入一個新的?segment file?,每秒鐘會產(chǎn)生一個新的磁盤文件?segment file?,這個?segment file?中就存儲最近 1 秒內(nèi) buffer 中寫入的數(shù)據(jù)。

        但是如果 buffer 里面此時沒有數(shù)據(jù),那當然不會執(zhí)行 refresh 操作,如果 buffer 里面有數(shù)據(jù),默認 1 秒鐘執(zhí)行一次 refresh 操作,刷入一個新的 segment file 中。

        操作系統(tǒng)里面,磁盤文件其實都有一個東西,叫做?os cache?,即操作系統(tǒng)緩存,就是說數(shù)據(jù)寫入磁盤文件之前,會先進入?os cache?,先進入操作系統(tǒng)級別的一個內(nèi)存緩存中去。只要?buffer?中的數(shù)據(jù)被 refresh 操作刷入?os cache?中,這個數(shù)據(jù)就可以被搜索到了。

        為什么叫 es 是準實時的?NRT?,全稱?near real-time?。默認是每隔 1 秒 refresh 一次的,所以 es 是準實時的,因為寫入的數(shù)據(jù) 1 秒之后才能被看到??梢酝ㄟ^ es 的?restful api?或者?java api?,手動執(zhí)行一次 refresh 操作,就是手動將 buffer 中的數(shù)據(jù)刷入?os cache?中,讓數(shù)據(jù)立馬就可以被搜索到。只要數(shù)據(jù)被輸入?os cache?中,buffer 就會被清空了,因為不需要保留 buffer 了,數(shù)據(jù)在 translog 里面已經(jīng)持久化到磁盤去一份了。

        重復上面的步驟,新的數(shù)據(jù)不斷進入 buffer 和 translog,不斷將?buffer?數(shù)據(jù)寫入一個又一個新的?segment file?中去,每次?refresh?完 buffer 清空,translog 保留。隨著這個過程推進,translog 會變得越來越大。當 translog 達到一定長度的時候,就會觸發(fā)?commit?操作。

        commit 操作發(fā)生第一步,就是將 buffer 中現(xiàn)有數(shù)據(jù)?refresh?到?os cache?中去,清空 buffer。然后,將一個?commit point?寫入磁盤文件,里面標識著這個?commit point?對應的所有?segment file?,同時強行將?os cache?中目前所有的數(shù)據(jù)都?fsync?到磁盤文件中去。最后清空?現(xiàn)有 translog 日志文件,重啟一個 translog,此時 commit 操作完成。

        這個 commit 操作叫做?flush?。默認 30 分鐘自動執(zhí)行一次?flush?,但如果 translog 過大,也會觸發(fā)?flush?。flush 操作就對應著 commit 的全過程,我們可以通過 es api,手動執(zhí)行 flush 操作,手動將 os cache 中的數(shù)據(jù) fsync 強刷到磁盤上去。

        translog 日志文件的作用是什么?你執(zhí)行 commit 操作之前,數(shù)據(jù)要么是停留在 buffer 中,要么是停留在 os cache 中,無論是 buffer 還是 os cache 都是內(nèi)存,一旦這臺機器死了,內(nèi)存中的數(shù)據(jù)就全丟了。所以需要將數(shù)據(jù)對應的操作寫入一個專門的日志文件?translog?中,一旦此時機器宕機,再次重啟的時候,es 會自動讀取 translog 日志文件中的數(shù)據(jù),恢復到內(nèi)存 buffer 和 os cache 中去。

        translog 其實也是先寫入 os cache 的,默認每隔 5 秒刷一次到磁盤中去,所以默認情況下,可能有 5 秒的數(shù)據(jù)會僅僅停留在 buffer 或者 translog 文件的 os cache 中,如果此時機器掛了,會丟失?5 秒鐘的數(shù)據(jù)。但是這樣性能比較好,最多丟 5 秒的數(shù)據(jù)。也可以將 translog 設置成每次寫操作必須是直接?fsync?到磁盤,但是性能會差很多。

        實際上你在這里,如果面試官沒有問你 es 丟數(shù)據(jù)的問題,你可以在這里給面試官炫一把,你說,其實 es 第一是準實時的,數(shù)據(jù)寫入 1 秒后可以搜索到;可能會丟失數(shù)據(jù)的。有 5 秒的數(shù)據(jù),停留在 buffer、translog os cache、segment file os cache 中,而不在磁盤上,此時如果宕機,會導致 5 秒的數(shù)據(jù)丟失。

        總結一下,數(shù)據(jù)先寫入內(nèi)存 buffer,然后每隔 1s,將數(shù)據(jù) refresh 到 os cache,到了 os cache 數(shù)據(jù)就能被搜索到(所以我們才說 es 從寫入到能被搜索到,中間有 1s 的延遲)。每隔 5s,將數(shù)據(jù)寫入 translog 文件(這樣如果機器宕機,內(nèi)存數(shù)據(jù)全沒,最多會有 5s 的數(shù)據(jù)丟失),translog 大到一定程度,或者默認每隔 30mins,會觸發(fā) commit 操作,將緩沖區(qū)的數(shù)據(jù)都 flush 到 segment file 磁盤文件中。

        數(shù)據(jù)寫入 segment file 之后,同時就建立好了倒排索引。

        刪除/更新數(shù)據(jù)底層原理

        如果是刪除操作,commit 的時候會生成一個?.del?文件,里面將某個 doc 標識為?deleted?狀態(tài),那么搜索的時候根據(jù)?.del?文件就知道這個 doc 是否被刪除了。

        如果是更新操作,就是將原來的 doc 標識為?deleted?狀態(tài),然后新寫入一條數(shù)據(jù)。

        buffer 每 refresh 一次,就會產(chǎn)生一個?segment file?,所以默認情況下是 1 秒鐘一個?segment file?,這樣下來?segment file?會越來越多,此時會定期執(zhí)行 merge。每次 merge 的時候,會將多個?segment file?合并成一個,同時這里會將標識為?deleted?的 doc 給物理刪除掉,然后將新的?segment file?寫入磁盤,這里會寫一個?commit point?,標識所有新的?segment file?,然后打開?segment file?供搜索使用,同時刪除舊的?segment file?。

        底層 lucene

        簡單來說,lucene 就是一個 jar 包,里面包含了封裝好的各種建立倒排索引的算法代碼。我們用 Java 開發(fā)的時候,引入 lucene jar,然后基于 lucene 的 api 去開發(fā)就可以了。

        通過 lucene,我們可以將已有的數(shù)據(jù)建立索引,lucene 會在本地磁盤上面,給我們組織索引的數(shù)據(jù)結構。

        倒排索引

        在搜索引擎中,每個文檔都有一個對應的文檔 ID,文檔內(nèi)容被表示為一系列關鍵詞的集合。例如,文檔 1 經(jīng)過分詞,提取了 20 個關鍵詞,每個關鍵詞都會記錄它在文檔中出現(xiàn)的次數(shù)和出現(xiàn)位置。

        那么,倒排索引就是關鍵詞到文檔?ID 的映射,每個關鍵詞都對應著一系列的文件,這些文件中都出現(xiàn)了關鍵詞。

        舉個栗子。

        有以下文檔:

        DocIdDoc
        1谷歌地圖之父跳槽 Facebook
        2谷歌地圖之父加盟 Facebook
        3谷歌地圖創(chuàng)始人拉斯離開谷歌加盟 Facebook
        4谷歌地圖之父跳槽 Facebook 與 Wave 項目取消有關
        5谷歌地圖之父拉斯加盟社交網(wǎng)站 Facebook

        對文檔進行分詞之后,得到以下倒排索引。

        WordIdWordDocIds
        1谷歌1, 2, 3, 4, 5
        2地圖1, 2, 3, 4, 5
        3之父1, 2, 4, 5
        4跳槽1, 4
        5Facebook1, 2, 3, 4, 5
        6加盟2, 3, 5
        7創(chuàng)始人3
        8拉斯3, 5
        9離開3
        104
        ......

        另外,實用的倒排索引還可以記錄更多的信息,比如文檔頻率信息,表示在文檔集合中有多少個文檔包含某個單詞。

        那么,有了倒排索引,搜索引擎可以很方便地響應用戶的查詢。比如用戶輸入查詢?Facebook?,搜索系統(tǒng)查找倒排索引,從中讀出包含這個單詞的文檔,這些文檔就是提供給用戶的搜索結果。

        要注意倒排索引的兩個重要細節(jié):

        • 倒排索引中的所有詞項對應一個或多個文檔;
        • 倒排索引中的詞項根據(jù)字典順序升序排列

        上面只是一個簡單的栗子,并沒有嚴格按照字典順序升序排列。


        往期推薦

        說說你知道的數(shù)據(jù)庫常用架構方案?

        Spring 與 Spring Boot 中的事件機制

        為什么阿里規(guī)定需要在事務注解@Transactional中指定rollbackFor?

        Mybatis 框架下 SQL 注入攻擊的 3 種方式,真是防不勝防!

        Spring Boot 中的 @EnableAutoConfiguration 是如何處理的?


        掃一掃,關注我

        一起學習,一起進步

        瀏覽 46
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            国产视频在线播放| 欧美一级A片高清免费播放| 婷婷免费视频| 蜜桃AV在线播放| 日日干综合| 免费一级大片| 亚洲乱伦小说网| 岛国电影av| a片免费网址| 亚洲欧洲自拍| 欧美肏屄网| 在线观看av中文字幕| 91乱伦| www.蜜桃| 69免费视频| 亚洲免费高清视频| 亚州精品人妻一二三区| www.777av| av影音在线| 黄网免费观看| 久草手机视频在线观看| 黄片视频在线| 日韩精品成人免费观看视频| 亚洲免费观看高清完| 黄色不卡视频| 超碰午夜| 中文字幕综合在线| 国产一级黄色A片| 丁香五月婷婷综合网| 一起操逼| 国产叼嘿视频| 人人干人人操人人爽| 五丁香在线观看AV| 日韩欧美亚洲| av一区二区三区| 91老熟女| 亚洲五月婷婷| 伊人成人在线| 大乳奶一级婬片A片| 91AV在线播放| 超碰亚洲| 色色天堂| 亚洲色视频| 黄色一级网站| 午夜婷婷| 老骚老B老太太A片| 国产乱伦网站| 黄色视频免费看| 黑人AV| 高颜值呻吟给力| 麻豆精东一区二区欧美国产| a无码| 肏逼网| 婷婷五月天激情俺来也| 伊人网站| 日本高清一区二区高清免费视频| 国产日韩欧美| 激情淫荡少妇| 福利视频网亚洲| 青青青在线| 手机毛片在线播放| 91丨九色丨熟女老版| 日韩黄在线| 2019狠狠操| 99在线精品视频在线观看| 91久久性奴调教| 亚洲色成人网站www永久四虎| 99国产精品久久久久久久| 在线观看免费高清无码| 色色在线观看| 99r6热只有精品免费观看| 日韩三区在线| 加勒比国产在线| 天堂va欧美ⅴa亚洲va一夜| 国产精品九九九九九九| 好逼天天有| 国产精品宾馆在线| 天天干妹子| 亚洲va在线| 91jiujiu| 91亚洲国产AⅤ精品一区二区| 日韩三级在线观看| 91在线无码精品秘| 囯产精品久久久久久久久久| 在线你懂| 日韩人妻无码专区| 大香蕉国产视频| 中文字幕高清AⅤ| 久久人妻无码中文字幕系列| www.在线播放| 成人视频高清无码| AV婷婷在线| www.97cao| 91爱爱·com| 大香蕉在线看| 簧片在线免费观看| 日产无码| 大香蕉精品视频| 一级片在线观看视频| 看操逼视频| 欧美性受XXXX黑人XYX性爽| 99青草在线视频| 很色很黄的A片一| 国产婬片一级A片AAA毛片AⅤ| 日日干网| 97成人在线视频| 国产免费无码视频| 中文字幕福利视频| 中文无码日韩欧美久久| 玖玖国产| 免费观看无码| 国产又爽又黄免费视频免费观看| 国产熟女一区二区视频网站| 亚洲天堂2014| 在线免费黄色网址| 亚洲视频在线观看网站| 日韩三级在线播放| 欧美在线免费视频| 亚洲激情黄色| 欧美日韩在线一区| 嫩BBB嫩BBB嫩BBBn嫩| 91成人做爰A片| 99re6热在线精品视频功能| 北条麻妃精品青青久久价格| 国产综合色网| 亚洲AV无码乱码国产| 精品国内自产拍在线观看视频 | 国产一级a毛一级a毛观看视频网站| 日韩特级片| 国产女人在线| 麻豆天美传媒AV果冻传媒| 人妻丝袜蕾丝高跟双飞| 日韩三级视频在线观看| 精品素人在线| 久久这里只有精品9| 国产精品无码ThePorn| 一级无码高清| 91视频免费网站| 欧美在线观看视频| 操b视频免费看| 无码不卡在线播放| 五月丁香婷婷基地| 三级片一区| 成人午夜毛片| 黄视频免费在线观看| 欧洲天堂在线视频网站| 欧一美一伦一A片| 深爱激情综合网| 乱伦激情| 亚洲日韩视频在线| 亚洲欧美国产精品专区久久| 精品视频一区二区三区四区| 嫩草视频在线观看免费网站| 熟女资源站| 国产一区二区三区四区在线观看| 国产成人免费看| 操东北女人逼| 国产有码视频| 亚洲中字幕新| 亚洲AV秘无码一区在线| 99大香蕉视频| 在线成人毛片| 成人伊人电影| 黑巨茎大战欧美白妞小说| 18一20女一片毛片| 91爱搞搞| 97资源视频| 国产A级毛片久久久久久| 久久久久久久久久成人永久免费视频 | 精品九九九九| 国产精品久久久久久久久| 日韩黄色A级片| 天天A片| 人人干天天干| 日韩肏逼| 黄片免费大全| 777性爱| 色播国产成人AV| 豆花在线视频| h片免费在线观看| 久久内射| 波多野结衣视频在线观看| 亚洲天堂在线观看免费视频| 操逼视频网址| 人人操夜夜操| 欧美猛男的大鷄巴| 国产嫩草影院| 大香蕉综合久久| 亚洲无码专区在线观看| 人成视频在线观看| 五月丁香激情六月| 国产成人精品久久二区二区91| 精品无码一区二区三区免费| 在线免费观看一区| 亚洲群交| 欧美大胆a| 麻豆自拍偷拍视频| 18毛片| 91无码人妻一区二区三区| 小黄片高清无码| 天堂网色| 亚欧洲精品在线视频免费观看 | 在线观看欧美日韩| 国产一级A片| 精品国产999久久久免费| 男女无套在线观看免费| 91久久婷婷国产| 欧美日韩三级| 九色av| 精品成人在线视频| 一道本av| 日韩A片一级无码免费蜜桃| 99久久精彩视频| 操美女视频网站| 麻豆免费成人视频| 99久热| 日本一级婬片A片免费播放一| 黄色电影A| 最好看的MV中文字幕国语| 成人精品视频| 一本久道视频一本久道| 草草影院国产第一页| 自拍偷拍视频网站| 亚洲国产精品成人综合色五月| 热久久最新地址| 国产网址| 男女午夜福利| 国产免费激情视频| A级片网站| 精品无码电影| 淫乱人妻| 99re这里只有精品6| 日韩精品一区二区在线观看| 人妻免费视频| 精品乱子伦一区二区三区毛| 91看片看婬黄大片Videos| 日本天堂在线| 精品熟女| 亚洲操逼AV| 日日干综合| 丁香激情五月| 欧美老妇BBBBBBBBB| 日韩福利网| 91在线精品一区二区| 国产精品久久久无码专区| 岛国AV免费在线| 国精产品一二四区黑人| 91亚洲视频| 高清无码视频直接看| 一级二级三级无码| 久久久精品电影| 五月丁香无码| 综合久久中文字幕| 91人人澡人人爽人人看| 欧美在线观看一区二区| 嫩草入口| 日毛片| 欧美A一| 中文字幕在线视频第一页| 99er视频| 夜色321| 韩国人妻无码| 狠狠狠狠操| 亚洲精品天堂无码| 成人黄色免费看| 欧美一二三区| 狼人综合影院| 欧美日韩高清一区二区三区 | 激情小视频国产在线播放| 色先锋资源站| 免费看黄片,在线观看| 男人天堂AV片| 久久艹伊人| 久久cao| 欧美成人不卡| 成人网站无码| 无码aa| 97色色视频| 蜜臀av一区二区| 高清无码一区| 无码国产+白浆| 日本超碰在线| 69成人导航| 亚洲AV无码专区在线播放中文| 91久久综合亚洲鲁鲁五月天| 极品少妇视频| 亚洲欧美成人在线视频| 午夜福利毛片| 亚洲A片免费看| 亚洲.欧美.丝袜.中文.综合| 国产精品毛片久久久久久久| 精品国产AV鲁一鲁一区| 成人高清无码在线观看| 国产久久久久| 一级黄在线观看| 91网站免费看| 国产操逼免费看| 污视频网站在线观看| 国产精品扒开腿做爽爽爽A片唱戏 中文字幕一区二区三区精华液 | 无码一区二区黑人猛烈视频网站 |