ES中搜索請求的講解
ES中一個搜尋請求是怎麼流轉的
1、搜尋請求傳送到某一個coordinate node,構建一個priority queue,長度以paging操作from和size為準,預設為10
2、coordinate node將請求轉發到所有shard,每個shard本地搜尋,並構建一個本地priority queue
3、各個shard將自己的priority queue返回給coordinate node ,並構建一個全域性的priority queue
4、replica shard如何提升搜尋吞吐量
一次請求要打到所有shard的一個replica/primary上去,如果每個shard都有多個replica,那麼同時併發過來的搜尋請求可以同時打到其他的replica上去
5、coordinate node構建完priority queue之後,獲取到的是一堆doc id等資訊,就傳送mget請求去所有shard上獲取對應的document
6、各個shard將document返回給coordinate node
7、coordinate node將合併後的document結果返回給client客戶端
8、一般搜尋,如果不加from和size,就預設搜尋前10條,按照_score排序
例如:
coordinate node ,根據from和size引數,構建一個priority queue大小就是from+size,from=0,size=10,構建一個0+10大小的佇列,from=10000,size=10,構建一個10000+10=10010大小的佇列,將請求轉發到這個index對應的所有shard上,接收到請求的shard,其實都會構建一個from+size大小的本地priority queue,每個shard都會構建一個10000+10=10010大小的priority queue.
每個shard將自己的10010條資料,返回給coordinate node ,coordinate node將所有shard的from+size大小的priority queue 進行merge,merge成一份from+size 大小的priority queue,全域性排序後的queue,放到自己的queue中。此時coordinate queue,就可以將自己的priority queue中的資料,取出當前要獲取的那一頁的資料了,比如從第10000條,取到10010條
**deep paging問題:**就是from+size分頁太深,那麼每個shard都要返回大量資料給coordinate node,消耗大量的頻寬,記憶體,CPU。