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>

        ElasticSearch 面試 4 連炮,你頂?shù)米∶矗?/h1>

        共 4713字,需瀏覽 10分鐘

         ·

        2021-01-29 11:24


        作者 |?kevin0016

        來源 |?https://www.jianshu.com/p/d6fd7e8cf220

        面試題

        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é)調節(jié)點)。

        • coordinating node?對 document 進行路由,將請求轉發(fā)給對應的 node(有 primary shard)。

        • 實際的 node 上的?primary shard?處理請求,然后將數(shù)據(jù)同步到?replica node

        • coordinating node?如果發(fā)現(xiàn)?primary node?和所有?replica node?都搞定之后,就返回響應結果給客戶端。

        因女友的一句話,他做了個10億美元的App!網(wǎng)友評:萬事俱備,就差個女友了~

        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特別牛

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

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

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

        曾經(jīng)風光無限的鐵飯碗沒了...網(wǎng)友評論:996卷走了955的他們...

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

        如果 buffer 快滿了,或者到一定時間,就會將內存 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 秒內 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)級別的一個內存緩存中去。只要?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 都是內存,一旦這臺機器死了,內存中的數(shù)據(jù)就全丟了。所以需要將數(shù)據(jù)對應的操作寫入一個專門的日志文件?translog?中,一旦此時機器宕機,再次重啟的時候,es 會自動讀取 translog 日志文件中的數(shù)據(jù),恢復到內存 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ù)寫入 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,文檔內容被表示為一系列關鍵詞的集合。例如,文檔 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)查找倒排索引,從中讀出包含這個單詞的文檔,這些文檔就是提供給用戶的搜索結果。

        往期推薦

        因女友的一句話,他做了個10億美元的App!網(wǎng)友評:萬事俱備,就差個女友了~

        曾經(jīng)風光無限的鐵飯碗沒了...網(wǎng)友評論:996卷走了955的他們...

        為什么漢字不能當密碼,假如用漢字做密碼,又會怎樣?

        日本政府用AI分配對象了!給你分一個的話,敢不敢要?

        AWS回應Elastic修改開源協(xié)議:創(chuàng)建“真正”開源的Elasticsearch分支



        瀏覽 65
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報

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

        手機掃一掃分享

        分享
        舉報
        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>
            波多野结衣AV在线观看| 91理论片| 99热在线免费观看| 在线免费看黄色| 强伦轩人妻一区二区三区最新版本更新内容 | 亚洲精品字幕| 中文字幕中文字幕一区| 欧美特级AAA| 无码一区二区北条| 亚洲AV白浆| 日日夜夜爱| 国产成人电影一区二区| 嫩BBB槡BBBB槡BBBB二一| 免费三级片网址| 激情综合网五月| 国产精品久久无码| 国产成人无码一区二区| 欧美天堂在线观看| 黄页网站免费在线观看| 亚洲高清无码在线| 色我影院| 精品亚洲一区二区三区| 影音先锋男人天堂| 国产美女一区| 国产av不卡| 午夜无码人妻AV| 欧美一区二区无码视频| 亚洲AV自拍| 干少妇视频| 国产成人无码一区二区在线播放 | 青娱乐免费视频| 人人摸人人搞| 亚洲不卡免费视频| 黄色大片网址| 一区二区三区观看| 日本三区| 日本少妇高潮| 成人做爰黄A片免费看三区蜜臀| 日日撸视频| 无码在线视频播放| 色色色色综合| 美女黄色免费网站| 丁香五月天视频| 球AV在线| 天天草夜夜操| 免费无码在线视频| 内射视频免费观看| 99操逼| 6969电视影片最新更新| 丰满大爆乳波霸奶| 国产v欧美| 桃色一区| 大鸡巴在线视频| 精品久久91| 在线观看免费视频a| 超碰人人操人人摸| 日本十八禁网站| 婷婷五月天在线观看| 91丨熟女露脸| av在线天堂网| 久久黄色免费视频| 黄片二区| 女人自慰网站在线观看| 国产成人69| 操屄视频网站| 欧美国产日韩在线| 欧美怡春院| 大香蕉视频国产| 综合伊人大香蕉| 一道本高清无码| 成人视频123| 免费一级网站| 国产成人免费在线| 日韩肏屄视频在线观看| 九九香蕉网| 有码一区二区三区| 操逼大全| 亚洲高清视屏| 刘玥精品国产一区二区三区| 亚洲成av人无码| 亚洲无码激情| 国产婷婷精品| 特级西西444WWW高清| 男女无码| 亚洲视频网址| 日韩AV成人电影| 插吧插吧网| 天天干天天射天天| 超碰在线无码| 一本一道久久综合狠狠躁牛牛影视| 国产黄色电影在线| 国产三级黄| 亚洲日韩欧美视频| 国产免费A片| 影音先锋男人| 特级西西444www精品视频| 草逼com| 熟妇在线观看| 超碰成人免费| 操逼导航| 成人黄色在线| 成人午夜大片| A片在线免费播放| 天堂久久av| 日本精品视频在线| 啪啪网站免费看| 免费尻屄视频| 亚洲色色色| 二区三区免费视频| 精品视频无码| 国产精品三级在线观看| 天天视频色| 国产乱伦免费| caoporen| 亚洲一级免费免费在线观看| 亚洲欧美激情视频| 操逼操逼操逼操逼操逼操逼 | 亚洲中文字幕在线观看| www.天天射视频| 影音先锋AV成人| jizz在线视频| 日日久视频| 特级西西人体444www高清大胆 | 国精产品一区一区三区| 中文字幕有码视频| 黄色视频免费在线观看| 浮力影院久久| v天堂在线观看| 日韩高清无码免费观看| 俺来也听听婷婷| 嫩BBB| 亚洲福利在线观看视频| 免费黄色视频网站| 蜜桃av秘无码一区二区三区| 波多野结衣黄色| 成人福利小视频| 91在线无码精品秘软件| 青青草精品| 国产美女啪啪视频| 青青无码| 3D动漫啪啪精品一区二| 狼友在线视频| 快播激情小说| 欧美成人午夜影院| 精品啪啪| 国产黄片免费视频| 日逼视频免费| 波多野结衣在线无码| 国产熟妇搡BBBB搡BBBB毛片 | 国产精品美女视频| 中文字幕第2页| 性BBwBBwBBwBBw禽| 爆操太妹| 黄色片视频日本| 毛片1| 亚洲视频91| 91久久久久国产一区二区| 中文字幕在线观看免费高清电影| 国产黄色自拍视频| 国产操老女人| 激情a| 国产免费av在线| 加勒比日韩| 久草香蕉视频| 大香蕉伊在线观看| 日本天堂Tv视频在线观看| 一本色道久久综合熟妇人妻| 妞干网国产| 超碰伊人大香蕉| 精品一区二区久久久久久久网站| 九色PORNY自拍视频| 91视频在线免费观看| 亚洲中文字幕播放| 黄色视频网站在线播放| 激情综合网五月| 亚洲综合天堂| 日本免费在线| 最新中文字幕视频| 免费A片在线| 成人在线三级片| 国产娇小13videos糟蹋| 爱爱视频免费| 热久久亚洲中文字幕| 91精品国际| 国产高清免费视频| 婷婷五月开心五月| 91麻豆精品在线| 青青草无码成人天堂免费| 免费国产黄色| 手机看片福利一区二区| 国产超级无码高清在线视频观看| 国产精品av在线播放| 国产日韩欧美在线播放| 操逼一区二区| 老妇性BBWBBWBBWBBW| 91AV在线观看视频| 久久精品久久久久久久| 亚洲熟女少妇| 五月天成人社区| 亚洲成人怡红院| 啊啊啊啊av| 先锋资源av在线| 在线黄片视频| 2015中文字幕黄色视频| 久久依人大香蕉| 亚洲中文无码电影| 无码AV电影| 国产成人在线播放| 欧美在线观看网站18| 18成人网站在线观看| 国内自拍无码| 国产电影一区二区三区| 日韩无码砖区| 欧美MV日韩MV国产网站| 日韩高清无码三级片| 色色9999| 国产高清做爱免费在线视频| 天天草天天日| 97人人人人人人| 黄片高清无码| 黄色片免费看| 嫩草视频在线播放| 日韩成人高清| 91狠狠| 天天视频色版免费观看视频| 日本无码毛片| 99热在线观看免费精品| 成人做爰黄A片免费看陈冠| 天天天天毛片| 三级无码在线播放| 国产作爱| 久久五月婷| 99久久久国产精品免费蜜臀| 亚洲人成人无码.www粉色| 人妻无码高清| 亚洲日韩精品秘在线观看| 亚洲AV无码高清| 无码秘蜜桃吴梦梦| 亚洲,制服,综合,中文| 欧美日韩男女淫乱一区二区| 久久精品婷婷| 国产迷奸视频| 欧美成人无码片免费看A片秀色| 日韩中文字幕无码人妻| 国产亚洲婷婷| 久久A√一区二区| 人人操超碰在线观看| 日韩午夜AV| 国产高清自拍| 一起操在线视频| 在线a| 青青国产| 高清无码操逼视频| 可以在线观看的AV| 欧美日在线| 丁香五月天色婷婷| 免费性爱网站| 国产一级a毛一级a毛视频在线网站 | 一本色道久久综合无码人妻软件| 91绿帽人妻-ThePorn| 国产手机AV在线| 狠狠狠狠狠狠干| 狠狠婷婷| 麻豆蜜桃wwww精品无码| 久久嫩草| 黄色美女网站| 人妻77777| 乱伦乱码| 亚洲自拍电影| 91鸡巴| 日本aaaa片| 激情开心五月天| 丰满人妻一区二区免费看| 在线视频福利导航| 精品无码电影| AV电影免费看| 五月天婷婷成人| 成人免费黄色| 日本高清视频www| 农村三级片| 无码精品一区二区三区同学聚会| 综合激情五月婷婷| 天天射夜夜操| 日日操视频| 国产小毛片| 午夜福利视频91| 特级西西444www高清视频| 精品中文字幕视频| 日韩三级成人| 中文字幕国产| 韩国无码视频在线观看| 国产综合精品久久久久成人AV| 国产十欧洲十美国+亚洲一二三区在线午夜| 91久久婷婷亚洲精品成人| 欧洲一区二区三区| 精品国产一区二区三区性色AV| 激情五月激情综合网| 日韩欧美成人电影| 超碰天天射| 色婷网|