# 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
```

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