別名管理

集合別名是一個虛擬集合,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.namerouter.1.field)。

在 v2 請求中,路由維度會指定為列表中的個別物件(例如 [{"type": "category", "field": "manu_id_s"}])。

router.name (v1), type (v2)

必填

預設值:無

修改:建立後請勿變更

要使用的路由類型。目前只有 timecategoryDimensional[] 是有效的。v2 請求只允許 timecategory,因為維度資訊存在於 v2 請求特有的 routers 列表中(儘管以下關於維度順序的注意事項仍然適用)。

多維路由別名(又名「DRA」)的情況下,必須以它們在維度陣列中出現的相同順序表示所有維度。DRA router.name 的格式為 Dimensional[dim1,dim2],其中 dim1dim2 是每個子維度的有效 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/SECONDNOW/MINUTE 等會正常運作。

TZ (v1), tz (v2)

選填

預設值:UTC

修改:僅限專家

在評估 router.startrouter.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 對正規表示式的實作。

維度路由別名參數

router.#. (v1)

選填

預設值:無

修改:如上所述

在 v1 請求參數上使用的前綴,用於在多維別名中將參數與特定維度關聯。

例如,在 Dimensional[time,category] 別名中,router.0.start 將用於設定時間維度的開始時間。

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

LISTALIASES 取得單個別名的詳細資訊

  • 僅限 V2 API

curl -X GET https://127.0.0.1:8983/api/aliases/testalias2

LISTALIASES 回應

輸出將包含別名及其對應集合名稱的清單。

使用 LISTALIASES 的範例

列出現有的別名

輸入

curl -X GET https://127.0.0.1:8983/api/aliases

輸出

{
  "responseHeader": {
    "status": 0,
    "QTime": 1
  },
  "aliases": {
    "testalias1": "collection1",
    "testalias2": "collection2,collection1"
  },
  "properties": {
    "testalias2": {
      "someKey": "someValue"
    }
  }
}

取得單個別名的詳細資訊

輸入

curl -X GET https://127.0.0.1:8983/api/aliases/testalias2

輸出

{
  "responseHeader": {
    "status": 0,
    "QTime": 1
  },
  "name": "testalias2",
  "collections": [
    "collection2",
    "collection1"
  ],
  "properties": {
    "someKey": "someValue"
  }
}

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,此動作將會非同步處理

ALIASPROP 回應

輸出將僅是一個 responseHeader,其中包含處理請求所花費的時間的詳細資訊。可以使用下面描述的「列出別名屬性」API 來確認別名屬性的建立,或者檢查 Solr 管理 UI「Cloud」區段中的 aliases.json

列出別名屬性

擷取與指定別名相關聯的中繼資料屬性。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,此動作將會非同步處理

DELETEALIAS 回應

輸出將僅是一個 responseHeader,其中包含處理請求所花費的時間的詳細資訊。若要確認別名的移除,您可以在 Solr 管理 UI 的「Cloud」區段下找到 aliases.json 檔案。