轉自:http://my.oschina.net/crxy/blog/422287?p=1
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這個方法,
這樣的話就可以從用戶指定的多個節點中獲取數據。
把項目重新打包,放到服務器上重新啟動。













