别名管理

集合别名是一个虚拟集合,Solr 将其视为普通集合。别名集合可能指向一个或多个真实集合。

集合别名的一些用例

  • 时间序列数据

  • 在后台重新索引内容

有关 Solr 中别名的概述,请参见 别名部分。

CREATEALIAS:为集合创建或修改别名

CREATEALIAS 操作将创建一个指向一个或多个集合的新别名。别名有两种类型:标准别名和路由别名。

标准别名很简单: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,则可能创建任何中间集合)。初始集合和任何后续集合都将使用指定的配置集创建。除 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 (v1), 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 文件。