分布式檢索

一個(gè) CRUD 操作只對(duì)單個(gè)文檔進(jìn)行處理,文檔的唯一性由 _index, _type, 和 [routing values]路由一個(gè)文檔到一個(gè)分片中") (通常默認(rèn)是該文檔的 _id )的組合來確定。 這表示我們確切的知道集群中哪個(gè)分片含有此文檔。
搜索需要一種更加復(fù)雜的執(zhí)行模型因?yàn)槲覀儾恢啦樵儠?huì)命中哪些文檔: 這些文檔有可能在集群的任何分片上。 一個(gè)搜索請(qǐng)求必須詢問我們關(guān)注的索引(index or indices)的所有分片的某個(gè)副本來確定它們是否含有任何匹配的文檔。
但是找到所有的匹配文檔僅僅完成事情的一半。 在 search 接口返回一個(gè) page 結(jié)果之前,多分片中的結(jié)果必須組合成單個(gè)排序列表。 為此,搜索被執(zhí)行成一個(gè)兩階段過程,我們稱之為 query then fetch

查詢階段
在初始 查詢階段 時(shí), 查詢會(huì)廣播到索引中每一個(gè)分片拷貝(主分片或者副本分片)。 每個(gè)分片在本地執(zhí)行搜索并構(gòu)建一個(gè)匹配文檔的 優(yōu)先隊(duì)列。
一個(gè) 優(yōu)先隊(duì)列 僅僅是一個(gè)存有 top-n 匹配文檔的有序列表。優(yōu)先隊(duì)列的大小取決于分頁(yè)參數(shù) from 和 size 。例如,如下搜索請(qǐng)求將需要足夠大的優(yōu)先隊(duì)列來放入100條文檔

GET /_search
{
    "from": 90,
    "size": 10
}
查詢過程分布式搜索

查詢階段包含以下三個(gè)步驟:

  1. 客戶端發(fā)送一個(gè) search 請(qǐng)求到 Node 3 , Node 3 會(huì)創(chuàng)建一個(gè)大小為 from + size 的空優(yōu)先隊(duì)列。
    2.Node 3 將查詢請(qǐng)求轉(zhuǎn)發(fā)到索引的每個(gè)主分片或副本分片中。每個(gè)分片在本地執(zhí)行查詢并添加結(jié)果到大小為 from + size 的本地有序優(yōu)先隊(duì)列中。
  2. 每個(gè)分片返回各自優(yōu)先隊(duì)列中所有文檔的 ID 和排序值給協(xié)調(diào)節(jié)點(diǎn),也就是 Node 3 ,它合并這些值到自己的優(yōu)先隊(duì)列中來產(chǎn)生一個(gè)全局排序后的結(jié)果列表。

當(dāng)一個(gè)搜索請(qǐng)求被發(fā)送到某個(gè)節(jié)點(diǎn)時(shí),這個(gè)節(jié)點(diǎn)就變成了協(xié)調(diào)節(jié)點(diǎn)。 這個(gè)節(jié)點(diǎn)的任務(wù)是廣播查詢請(qǐng)求到所有相關(guān)分片并將它們的響應(yīng)整合成全局排序后的結(jié)果集合,這個(gè)結(jié)果集合會(huì)返回給客戶端。
第一步是廣播請(qǐng)求到索引中每一個(gè)節(jié)點(diǎn)的分片拷貝。就像 document GET requests 所描述的, 查詢請(qǐng)求可以被某個(gè)主分片或某個(gè)副本分片處理, 這就是為什么更多的副本(當(dāng)結(jié)合更多的硬件)能夠增加搜索吞吐率。 協(xié)調(diào)節(jié)點(diǎn)將在之后的請(qǐng)求中輪詢所有的分片拷貝來分?jǐn)傌?fù)載。
每個(gè)分片在本地執(zhí)行查詢請(qǐng)求并且創(chuàng)建一個(gè)長(zhǎng)度為 from + size 的優(yōu)先隊(duì)列—也就是說,每個(gè)分片創(chuàng)建的結(jié)果集足夠大,均可以滿足全局的搜索請(qǐng)求。 分片返回一個(gè)輕量級(jí)的結(jié)果列表到協(xié)調(diào)節(jié)點(diǎn),它僅包含文檔 ID 集合以及任何排序需要用到的值,例如 _score 。
協(xié)調(diào)節(jié)點(diǎn)將這些分片級(jí)的結(jié)果合并到自己的有序優(yōu)先隊(duì)列里,它代表了全局排序結(jié)果集合。至此查詢過程結(jié)束。
一個(gè)索引可以由一個(gè)或幾個(gè)主分片組成, 所以一個(gè)針對(duì)單個(gè)索引的搜索請(qǐng)求需要能夠把來自多個(gè)分片的結(jié)果組合起來。 針對(duì) multiple 或者 all 索引的搜索工作方式也是完全一致的—?僅僅是包含了更多的分片而已。

分布式搜索的取回階段


分布式搜索的取回階段
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容