別名管理
集合別名是一個虛擬集合,Solr 對待它的方式與一般集合相同。別名集合可以指向一個或多個實際集合。
集合別名的一些使用案例
-
時間序列資料
-
在幕後重新索引內容
有關 Solr 中別名的概述,請參閱 別名 一節。
CREATEALIAS:建立或修改集合的別名
CREATEALIAS
動作將建立一個新的別名,指向一個或多個集合。別名有 2 種形式:標準和路由。
標準別名很簡單:CREATEALIAS
使用命令提供的名稱註冊別名名稱以及一個或多個集合的名稱。如果存在現有的別名,它將被替換/更新。
標準別名可以用作重新命名集合的一種方法,並且可以用於以原子方式交換哪個後端/基礎集合用於各種目的的「即時」狀態。
當 Solr 搜尋指向多個集合的別名時,Solr 會將所有集合的所有分片作為一個整體進行搜尋。雖然可以將更新發送到跨越多個集合的別名,但標準別名沒有在參考集合之間分配文件的邏輯,因此所有更新都將轉到列表中的第一個集合。
/admin/collections?action=CREATEALIAS&name=name&collections=collectionlist
路由別名是具有額外功能的別名,可以充當一種超級集合,將更新路由到正確的集合。
路由是資料驅動的,並且可以基於時間欄位或欄位中指定的類別(通常是字串型)。在開始之前,請參閱 路由別名,了解一些重要的高階資訊。
$ https://127.0.0.1:8983/solr/admin/collections?action=CREATEALIAS&name=timedata&router.start=NOW/DAY&router.field=evt_dt&router.name=time&router.interval=%2B1DAY&router.maxFutureMs=3600000&create-collection.collection.configName=myConfig&create-collection.numShards=2
如果於 2018 年 1 月 15 日執行,上述指令將會建立一個名為 timedata 的時間路由別名,其中包含名稱前綴為 timedata
的集合,並會立即建立一個名為 timedata_2018_01_15
的初始集合。傳送至此別名的更新,若其 evt_dt
中的值早於或晚於 2018-01-15,將會被拒絕,直到 2018-01-15 的最後 60 分鐘。在 2018-01-15T23:00:00 之後,將會接受 2018-01-15 或 2018-01-16 的文件。一旦系統接收到允許時間範圍內的文件,且該時間範圍沒有對應的集合,系統將會自動建立下一個所需的集合(如果 router.interval
小於 router.maxFutureMs
,則可能會建立任何中間集合)。初始集合和任何後續集合都將使用指定的 configset 建立。除了 name
以外的所有集合建立參數都允許使用,並以 create-collection.
為前綴。
這表示可以將集合按天分區,並在每個每日集合中,根據客戶 ID 將資料路由到分片。這些分片可以是任何類型(NRT、PULL 或 TLOG),也可以使用基於規則的副本放置策略。
此命令中提供的集合建立值將會保留在別名屬性中,並且可以透過檢查 ZooKeeper 中的 aliases.json
來驗證。
只有更新會被路由,而查詢則會分發到別名中的所有集合。 |
CREATEALIAS 參數
name
-
必填
預設值:無
要建立的別名名稱。如果別名要進行路由,它也將作為將要建立的相依集合的名稱前綴。因此,它必須符合集合命名的正常要求。
async
-
選填
預設值:無
用於追蹤此動作的請求 ID,此動作將會非同步處理。
標準別名參數
collections
-
選填
預設值:無
要別名的集合的逗號分隔列表。這些集合必須已存在於叢集中。此參數表示要建立標準別名。如果存在此參數,則禁止使用所有路由參數。如果存在路由參數,則禁止使用此參數。
路由別名參數
大多數路由別名參數會成為別名屬性,這些屬性可以隨後透過為相同名稱發出新的 CREATEALIAS 或透過 ALIASPROP 進行檢查和修改。CREATEALIAS 將會驗證許多(但不是全部)錯誤的值,而 ALIASPROP 會盲目接受您提供的任何鍵或值。CREATEALIAS 允許的一些「有效」修改可能仍然不明智,請參閱以下注意事項。「僅限專家」的修改在技術上是可能的,但需要對程式碼的運作方式有良好的理解,並且可能需要幾個先前的操作。
路由別名目前最多支援兩個路由「維度」,每個維度可以是基於「時間」或「類別」。每個維度都需要一些參數,這些參數會根據其類型而有所不同。
在 v1 請求中,路由維度參數會依查詢參數前綴分組。只有一個維度的路由別名會使用 router.
前綴來表示其參數(例如 router.field
)。二維路由別名會在此查詢參數前綴中加入一個數字,以區分參數屬於哪個路由維度(例如 router.0.name
、router.1.field
)。
在 v2 請求中,路由維度會指定為列表中的個別物件(例如 [{"type": "category", "field": "manu_id_s"}]
)。
router.name
(v1),type
(v2)-
必填
預設值:無
修改:建立後請勿變更
要使用的路由類型。目前只有
time
和category
和Dimensional[]
是有效的。v2 請求只允許time
或category
,因為維度資訊存在於 v2 請求特有的routers
列表中(儘管以下關於維度順序的注意事項仍然適用)。在多維路由別名(又名「DRA」)的情況下,必須以它們在維度陣列中出現的相同順序表示所有維度。DRA
router.name
的格式為Dimensional[dim1,dim2]
,其中dim1
和dim2
是每個子維度的有效router.name
值。請注意,DRA 仍處於實驗階段,目前僅支援 2D DRA。未來可能會支援更多維度。需要仔細設計維度路由,以避免叢集中集合數量爆炸。Solr Cloud 可能難以管理超過一千個集合。請參閱以下範例,以進一步澄清如何設定個別維度。 router.field
(v1),field
(v2)-
必填
預設值:無
修改:建立後請勿變更
要檢查以確定應將傳入文件路由到哪個底層集合的欄位。此欄位在所有傳入文件中都是必要的。
create-collection.*
-
選填
預設值:無
修改:是,僅影響新集合,請謹慎使用
*
萬用字元可以使用 CREATE 命令中的任何參數取代,但name
除外。所有其他欄位在需求和命名上都是相同的,只是我們堅持必須明確指定 configset。configset 必須事先建立,可以上傳或複製並修改。使用「資料驅動」模式可能不是一個好主意,因為結構描述變更可能會同時發生,導致錯誤。
在 v2 請求中,create-collection
採用 JSON 物件,其中包含所有提供的集合建立參數(例如 "create-collection": { "numShards": 3, "config": "_default"}
)。
時間路由別名參數
router.start
(v2),start
(v2)-
必填
預設值:無
修改:僅限專家
此時間路由別名的資料開始日期/時間,格式為 Solr 的標準日期/時間格式(即 ISO-8601 或「NOW」,可選擇使用 日期數學)。
為別名建立的第一個集合將會在內部以此值命名。如果提交的文件的
router.field
值早於別名指向的最早集合,則會產生錯誤,因為它無法路由。此日期/時間的毫秒元件必須為 0。特別是,這表示NOW
在 1000 次中有 999 次會失敗,但NOW/SECOND
、NOW/MINUTE
等會正常運作。 TZ
(v1),tz
(v2)-
選填
預設值:
UTC
修改:僅限專家
在評估
router.start
或router.interval
中的任何日期數學時要使用的時區。這與提供給搜尋查詢的相同參數相同,但請注意,在這種情況下,它會與大多數其他參數一起作為別名屬性保留。如果為此值提供 GMT-4,則日期為 2018-01-14T21:00:00:01.2345Z 的文件將會儲存在 myAlias_2018-01-15_01 集合中(假設間隔為 +1HOUR)。
router.interval
(v1),interval
(v2)-
必填
預設值:無
修改:是
一個日期數學表達式,將會附加到時間戳記以決定序列中的下一個集合。如果附加到 2018-01-15T16:17:18 格式的時間戳記,則任何可以評估的日期數學表達式都可以在這裡使用。
router.maxFutureMs
(v1),maxFutureMs
(v2)-
選填
預設值:
600000
毫秒修改:是
router.field
中允許文件擁有的最大未來毫秒數,以便可以接受而不會出錯。如果沒有限制,則錯誤的值可能會觸發建立許多集合。 router.preemptiveCreateMath
(v1),preemptiveCreateMath
(v2)-
選填
預設值:無
修改:是
一個日期數學表達式,會導致提前建立新集合。
如果文件到達時的時間戳記晚於最近的集合結束時間減去此間隔,則將會非同步建立下一個(且僅下一個)集合。
如果沒有此設定,則會在需要文件時間戳記時同步建立集合,因此會封鎖文件流,直到建立集合為止(可能需要幾秒鐘)。提前建立可以減少這些障礙。如果設定足夠的時間(可能一個小時或更長時間),則如果建立集合時出現問題,此時間範圍可能足以採取更正措施。但是,在成功提前建立之後,集合會在沒有被使用的情況下消耗資源,並且新文件傾向於只被路由到該集合,然後再路由到其他地方。
另請注意,
router.autoDeleteAge
目前是相對於新建立集合的日期來評估的,因此您可能需要將刪除期限增加提前視窗的時間量,以便不會太早刪除最舊的集合。必須可以從日期中減去指定的間隔,因此,如果加上減號會建立無效的日期數學,則會導致錯誤。另請注意,本身要前往不存在的集合的文件仍會觸發同步建立,直到該目的地集合為止,但不會觸發額外的非同步提前建立。每個文件只能發生一種集合建立類型。範例:
90MINUTES
。此屬性預設為空白,表示即時、同步建立新集合。
router.autoDeleteAge
(v1),autoDeleteAge
(v2)-
選填
預設值:無
修改:是,可能會遺失資料,請謹慎使用!
一個日期數學表達式,會導致自動刪除最舊的集合。
日期數學是相對於新建立集合的時間戳記(通常接近目前時間),因此必須透過捨入和/或減法產生較早的時間。要刪除的集合必須具有完全早於計算年齡的時間範圍。在建立新集合之前,會立即考慮刪除集合。範例:
/DAY-90DAYS
。預設值為不刪除。
類別路由別名參數
router.maxCardinality
(v1),maxCardinality
(v2)-
選填
預設值:無
修改:是
此別名允許的最大類別數。此設定可以防止因不良資料而無意中建立無限數量的集合。
router.mustMatch
(v1),mustMatch
(v2)-
選填
預設值:無
修改:是
router.field
指定的欄位值在建立對應集合之前必須符合的正規表示式。新增資料後變更此設定不會變更已編製索引的資料。可以指定任何有效的 Java 正規表示式模式。此表達式會在每個請求開始時預先編譯,因此強烈建議批次處理更新。過於複雜的模式會在編製索引期間產生 CPU 或垃圾收集開銷,具體取決於 JVM 對正規表示式的實作。
CREATEALIAS 回應
輸出將僅是一個 responseHeader,其中包含處理請求所花費的時間的詳細資訊。若要確認別名的建立,您可以在 Solr 管理 UI 的「Cloud」區段下找到 aliases.json
檔案。路由別名的初始集合也應在管理 UI 的各個部分可見。
使用 CREATEALIAS 的範例
建立一個名為「testalias」的別名,並將其連結到名為「foo」和「bar」的集合。
-
V1 API
-
V2 API
輸入
https://127.0.0.1:8983/solr/admin/collections?action=CREATEALIAS&name=testalias&collections=foo,bar&wt=xml
輸出
<response>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">122</int>
</lst>
</response>
輸入
curl -X POST https://127.0.0.1:8983/api/aliases -H 'Content-Type: application/json' -d '
{
"name":"testalias",
"collections":["foo","bar"]
}
'
輸出
{
"responseHeader": {
"status": 0,
"QTime": 125
}
}
一個有些牽強的範例,示範如何建立具有許多額外集合建立選項的 TRA。
-
V1 API
-
V2 API
輸入
https://127.0.0.1:8983/solr/admin/collections?action=CREATEALIAS
&name=somethingTemporalThisWayComes
&router.name=time
&router.start=NOW/MINUTE
&router.field=evt_dt
&router.interval=%2B2HOUR
&router.maxFutureMs=14400000
&create-collection.collection.configName=_default
&create-collection.router.name=implicit
&create-collection.router.field=foo_s
&create-collection.numShards=3
&create-collection.shards=foo,bar,baz
&create-collection.tlogReplicas=1
&create-collection.pullReplicas=1
&create-collection.property.foobar=bazbam
&wt=xml
輸出
<response>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">1234</int>
</lst>
</response>
輸入
curl -X POST https://127.0.0.1:8983/api/aliases -H 'Content-Type: application/json' -d '
{
"name": "somethingTemporalThisWayComes",
"routers" : [
{
"type": "time",
"field": "evt_dt",
"start":"NOW/MINUTE",
"interval":"+2HOUR",
"maxFutureMs":"14400000"
}
]
"create-collection" : {
"config":"_default",
"router": {
"name":"implicit",
"field":"foo_s"
},
"shardNames": ["foo", "bar", "baz"],
"numShards": 3,
"tlogReplicas":1,
"pullReplicas":1,
"properties" : {
"foobar":"bazbam"
}
}
}
'
輸出
{
"responseHeader": {
"status": 0,
"QTime": 1234
}
}
另一個範例,這次是維度路由別名,示範如何為個別維度指定參數。
-
V1 API
-
V2 API
輸入
https://127.0.0.1:8983/solr/admin/collections?action=CREATEALIAS
&name=dra_test1
&router.name=Dimensional[time,category]
&router.0.start=2019-01-01T00:00:00Z
&router.0.field=myDate_tdt
&router.0.interval=%2B1MONTH
&router.0.maxFutureMs=600000
&create-collection.collection.configName=_default
&create-collection.numShards=2
&router.1.maxCardinality=20
&router.1.field=myCategory_s
&wt=xml
輸出
<response>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">1234</int>
</lst>
</response>
輸入
curl -X POST https://127.0.0.1:8983/api/aliases -H 'Content-Type: application/json' -d '
{
"name":"dra_test1",
"routers": [
{
"type": "time",
"field":"myDate_tdt",
"start":"2019-01-01T00:00:00Z",
"interval":"+1MONTH",
"maxFutureMs":600000
},
{
"type": "category",
"field":"myCategory_s",
"maxCardinality":20
}
]
"create-collection": {
"config":"_default",
"numShards":2
}
}
'
輸出
{
"responseHeader": {
"status": 0,
"QTime": 1234
}
}
LISTALIASES:叢集中所有別名的清單
-
V1 API
-
V2 API
curl -X GET 'https://127.0.0.1:8983/solr/admin/collections?action=LISTALIASES'
curl -X GET https://127.0.0.1:8983/api/aliases
ALIASPROP:修改別名屬性
ALIASPROP
動作會修改別名上的屬性(中繼資料)。如果使用空值設定索引鍵,則會將其移除。
-
V1 API
-
V2 API
-
V2 API 透過屬性層級 API 更新
-
V2 API 透過屬性層級 API 刪除
curl -X POST 'https://127.0.0.1:8983/admin/collections?action=ALIASPROP&name=techproducts_alias&property.foo=bar'
curl -X PUT https://127.0.0.1:8983/api/aliases/techproducts_alias/properties -H 'Content-Type: application/json' -d '
{
"properties": {"foo":"bar"}
}'
curl -X PUT https://127.0.0.1:8983/api/aliases/techproducts_alias/properties/foo -H 'Content-Type: application/json' -d '
{
"value": "baz"
}'
curl -X DELETE https://127.0.0.1:8983/api/aliases/techproducts_alias/properties/foo -H 'Content-Type: application/json'
此命令允許您修改任何屬性。不會執行別名特定的驗證。如果屬性值設定不當,路由別名可能會停止運作、運作不正確或導致錯誤。 |
ALIASPROP 參數
name
-
必填
預設值:無
要設定屬性的別名名稱。
property.name=value
(v1)-
選填
預設值:無
將屬性 name 設定為 value。
"properties":{"name":"value"}
(v2)-
選填
預設值:無
要設定的屬性的名稱/值組的字典。
async
-
選填
預設值:無
用於追蹤此動作的請求 ID,此動作將會非同步處理。
列出別名屬性
擷取與指定別名相關聯的中繼資料屬性。Solr 的 v2 API 支援批量列出這些屬性,或根據需要個別存取它們(依名稱)。
-
V2 API 取得別名上的所有屬性
-
V2 API 取得別名上的單個屬性值
curl -X GET https://127.0.0.1:8983/api/aliases/techproducts_alias/properties
輸出
{
"responseHeader": {
"status": 0,
"QTime": 1
},
"properties": {
"foo": "bar"
}
}
curl -X GET https://127.0.0.1:8983/api/aliases/techproducts_alias/properties/foo
輸出
{
"responseHeader": {
"status": 0,
"QTime": 1
},
"value": "bar"
}
DELETEALIAS:刪除集合別名
-
V1 API
-
V2 API
https://127.0.0.1:8983/solr/admin/collections?action=DELETEALIAS&name=testalias
curl -X DELETE https://127.0.0.1:8983/api/aliases/testalias
DELETEALIAS 參數
name
-
必填
預設值:無
要刪除的別名名稱。在 v2 請求的路徑中指定,並作為 v1 請求的明確請求參數。
async
-
選填
預設值:無
用於追蹤此動作的請求 ID,此動作將會非同步處理。