ElasticSearch(ES)中的分片查詢方式
原文地址:http://www.bubuko.com/infodetail-836737.html
Es查詢的時候預設是隨機從一些分片中查詢資料,可以通過配置讓es從某些分片中查詢資料
1:_local
指查詢操作會優先在本地節點有的分片中查詢,沒有的話再在其它節點查詢。
2:_primary:指查詢只在主分片中查詢
3:_primary_first:指查詢會先在主分片中查詢,如果主分片找不到(掛了),就會在副本中查詢。
4:_only_node:指在指定id的節點裡面進行查詢,如果該節點只有要查詢索引的部分分片,就只在這部分分片中查詢,所以查詢結果可能不完整。如_only_node:123在節點id為123的節點中查詢。
5:_prefer_node:nodeid 優先在指定的節點上執行查詢
6:Custom (string) value:隨機指定一個值就可以。
7:_shards:0,1,2,3,4:查詢指定分片的資料
8:自定義:_only_nodes:nodeid1,nodeid2,nodeid3根據多個節點進行查詢
Es預設沒有提供這種查詢方式,所以就只能修改原始碼了。
首先找到org.elasticsearch.cluster.routing.operation.plain.PlainOperationRouting這個類,es搜尋時獲取分片資訊是通過這個類的。它的preferenceActiveShardIterator()方法就是根據條件來找出響應的分片。
看原始碼可知其主要是根據preference這個引數來決定取出的分片的。如果沒有指定該引數,就隨機抽取分片進行搜尋。
下面的程式碼就是根據上面說的不同情況進行的一些判斷,使用的switch case語句。
在裡面多增加一項ONLY_NODES,這個可以接收多個節點id,這個引數需要配置到preference列舉類中,還要在這個類中的switch判斷中判斷引數_only_nodes。新增case語句。
接下來就需要完善PlainOperationRouting類中的case語句判斷邏輯了。
首先獲取傳遞過來的所有節點id,以逗號分割。獲取一個節點id的陣列,下面迴圈判斷傳遞的節點是否存在,如果不存在就拋異常。
下面就返回一個方法的返回值,這個方法是需要我們自己實現的,這個方法可以參考上面的onlyNodeActiveInitializingShardsIt這個方法。
接下來完善onlyNodesActiveShardsIt這個方法,
這樣的話就可以從使用者指定的多個節點中獲取資料。
把專案重新打包,放到伺服器上重新啟動。