關于分片、查詢偏好、路由三者在查詢過程中的影響。
假設索引X包含4個分片,所有的分析基于這個前提進行讨論
GET /_search/?preference=_local&search_type=query_and_fetch
{
"query": {
"match_all": {}
}
}
整體流程:
http://x.x.x.x:9200/_cluster/state 擷取routing_table。

擷取查詢索引所有分片資訊 -> 根據路由篩選分片 -> 根據查詢偏好篩選分片對應的es節點 -> 針對擷取的分片及節點發送查詢請求
詳細分解流程:
1、client端發送請求到es叢集的任意一個節點(transaction),該節點作為協調節點開始進行處理。
2、首先擷取es叢集中關于索引X的分片資訊,得到分片1/2/3/4所在的節點。
3、如果查詢請求中帶有路由資訊,那麼會根據路由資訊和步驟2中的分片資訊擷取所在分片。
如果查詢請求中沒有帶有路由資訊,那麼就會擷取步驟2中得到的所有分片資訊。
4、針對每個分片擷取該分片所在的es節點(譬如分片1包括1副本,那麼分片1就分布在2個es節點上)
5、根據查詢偏好(如_local)那麼就在分片所在的多個es節點中按照本節點優先排在前面的方式進行查詢
6、索引X包含4個分片,是以會發起4次查詢請求(每個分片發送一個)。
7、在整個過程中路由和查詢偏好決定了每個分片應該優先去哪個節點進行查詢。