---
# System prepended metadata

title: SolrCloud 效能提升探討

---

# SolrCloud 效能提升探討

## 如何動態調整 Shard

### 1-1 設定Collection的Route Name？
**答：**  
在創建 Collection 時，可以指定要使用的 Router，

以下是範例指令：  

```bash
curl http://10.136.129.14:8981/solr/admin/collections?action=CREATE \
     &name=nested-ddf \
     &numShards=2 \
     &replicationFactor=2 \
     &router.name=implicit \
     &shards=shard1,shard2 \
     &collection.configName=nested
```
參數說明：
name=nested-ddf：集合名稱。
numShards=2：分片數量。
replicationFactor=2：副本數量。
router.name=implicit：路由類型設定為 implicit，允許手動控制資料的路由。
shards=shard1,shard2：手動指定 Shard 名稱。
collection.configName=nested：集合使用的配置名稱。

### 1-2 實驗將資料放到指定的 Shard

**答：**  
在 `/update` 後面加上 `_route_=shard_name` 即可指定資料的 Shard。

以下是範例指令：  

```bash
curl http://10.136.129.14:8981/solr/nested-ddf/update?_route_=shard1 \
  -H "Content-Type: application/json" \
  -d '[{
    "serviceType": 6,
    "modifiedTime": "2024-07-09T02:47:18Z",
    ...
  }]'
```

參數說明：
_route_=shard1：指定資料要寫入的 Shard。
-H "Content-Type: application/json"：設定請求的內容類型為 JSON。
-d '[...]'：包含要寫入的 JSON 資料。

### 1-3 實驗根據欄位有特定字眼的資料放到指定的 Shard

**答：** 可以在建collection的時候新增router.field, 就會根據欄位的資料值放進該值名稱的shard
但前提是要先有這個名稱的shard.

以下是範例指令：

v1版本
```
curl "http://10.136.129.14:8981/solr/admin/collections?action=CREATE&name=nested-ddf&numShards=2&router.name=implicit&router.field=appName&shards=shard1,shard2&collection.configName=nested"
```

v2版本
```
curl -X POST http://10.136.129.14:8981/api/collections -H 'Content-Type: application/json' -d \
'{
    "name": "nested-ddf",
    "config": "nested",
    "numShards": 2,
	"router": {
	 "name": "implicit",
	 "field": "appName"
    },
    "shardNames": ["mydms","shard2"]
}'
```
<span style="color:red">router.field</span> 的作用其實就是告訴SolrCloud 這筆資料要新增的時候要根據這個欄位的值去找對應名稱的Shard. 

所以假設設定 <span style="color:red">router.field=appName</span>, 要新增的該筆資料有個欄位<span style="color:red">appName=mydms</span>，

SolrCloud就會去找有沒有shard叫作<span style="color:red">mydms</span>, 將資料放進該shard的replica, 反之找不到就會報錯.

如果發現沒有該值名稱的shard, 可以透過API去新增該值名稱的shard

以下是範例指令：
v1版本
```
curl "http://10.136.129.14:8981/solr/admin/collections?action=CREATESHARD&shard=mydms&collection=nested-ddf"
```
v2版本

官網給的V2 API不能使用(算是有一個BUG, router.name使用implicit不能使用V2的API)

Use SPLITSHARD for collections created with the 'compositeId' router (router.key=compositeId).
```
curl -X POST http://10.136.129.14:8981/api/collections/nested-ddf/shards -H 'Content-Type: application/json' -d \
'{
  "shard":"newShardName"
}'
```

詳細資訊請參考:

建立Collection時指定router.field
https://solr.dev.org.tw/guide/solr/latest/deployment-guide/collection-management.htmlhttps://solr.dev.org.tw/guide/solr/latest/deployment-guide/collection-management.html

在已存的Collection新增Shard
https://solr.dev.org.tw/guide/solr/latest/deployment-guide/shard-management.htmlhttps://solr.dev.org.tw/guide/solr/latest/deployment-guide/shard-management.html

### 1-4 透過route.field 可以將特定欄位有特殊字眼的資料放到某個shard中, 可以再新增/刪除route.field嗎? 

**答：**  
可以透過在創建 Collection 時指定 `route.field`，將資料基於該欄位的值路由到不同的 Shard。  
但是，Solr 不支援在路由基礎上動態新增或刪除路由策略，只能透過重新配置 Collection 或手動處理資料。


### 1-5 如何拆分 Shard 或將過度拆分的 Shard 合併？

**答：**  

1. **拆分 Shard**  
   可以使用 Solr 提供的 `SplitShard` API 將 Shard 拆分為多個 Shard。  
   範例指令：  
   ```bash
   curl http://10.136.129.14:8981/solr/admin/collections?action=SPLITSHARD&collection=nested-ddf&shard=shard1
   ```

![image](https://hackmd.io/_uploads/S1zReK9BJg.png)

2. **合併 Shard**  
Solr 不提供直接將多個 Shard 合併的 API。
如需合併，需手動操作，可能涉及：
將資料重新導入到新的 Collection 中。
將原有的 Shard 資料進行轉移或重複分配。




