别名管理

集合别名是 Solr 将其视为与普通集合相同的虚拟集合。别名集合可以指向一个或多个真实集合。

集合别名的部分用例

  • 时间序列数据

  • 在幕后重新索引内容

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

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

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

标准别名很简单:CREATEALIAS 使用命令提供的集合名称注册别名名称。如果存在现有别名,则会替换/更新该别名。

标准别名可以作为重命名集合的一种方式,并且可用于以原子方式交换哪个后备/底层集合对各种用途“生效”。

当 Solr 搜索指向多个集合的别名时,Solr 将搜索所有集合的所有分片,作为聚合整体。虽然可以向跨越多个集合的别名发送更新,但标准别名没有用于在引用集合中分发文档的逻辑,因此所有更新都将转到列表中的第一个集合。

/admin/collections?action=CREATEALIAS&name=name&collections=collectionlist

路由别名是具有附加功能的别名,可作为一种超级集合,将更新路由到正确的集合。

路由是数据驱动的,可能基于时间字段或字段中指定的类别(通常基于字符串)。在开始之前,请参阅 路由别名,了解一些重要的高级信息。

$ http://localhost: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 的初始集合。在 2018-01-15 之前或之后 evt_dt 中具有(必需)值的发送到此别名的更新将被拒绝,直到 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/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 对正则表达式的实现。

维度路由别名参数

router.#. (v1)

可选

默认值:无

修改:如上所述

在多维别名中,用于在 v1 请求参数上关联参数与特定维度的前缀。

例如,在 Dimensional[time,category] 别名中,router.0.start 用于设置时间维度开始时间。

CREATEALIAS 响应

输出将只是一个 responseHeader,其中包含处理请求所花费时间的详细信息。要确认别名创建,您可以在 Solr 管理员 UI 的 Cloud 部分中查看 aliases.json 文件。路由别名的初始集合也应该在管理员 UI 的各个部分中可见。

使用 CREATEALIAS 的示例

创建一个名为“testalias”的别名,并将其链接到名为“foo”和“bar”的集合。

V1 API

输入

http://localhost: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>

V2 API 输入

curl -X POST http://localhost:8983/api/aliases -H 'Content-Type: application/json' -d '
  {
    "name":"testalias",
    "collections":["foo","bar"]
  }
'

输出

{
  "responseHeader": {
    "status": 0,
    "QTime": 125
  }
}

一个有点牵强的示例,演示如何使用许多其他集合创建选项创建 TRA。

V1 API

输入

http://localhost: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>

V2 API

输入

curl -X POST http://localhost: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

输入

http://localhost: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>

V2 API

输入

curl -X POST http://localhost: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

curl -X GET 'http://localhost:8983/solr/admin/collections?action=LISTALIASES'

V2 API

curl -X GET http://localhost:8983/api/aliases

LISTALIASES 获取单个别名的详细信息

仅限 V2 API

curl -X GET http://localhost:8983/api/aliases/testalias2

LISTALIASES 响应

输出将包含一个别名列表,其中包含相应的集合名称。

使用 LISTALIASES 的示例

列出现有别名

输入

curl -X GET http://localhost:8983/api/aliases

输出

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

获取单个别名的详细信息

输入

curl -X GET http://localhost:8983/api/aliases/testalias2

输出

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

ALIASPROP:修改别名属性

ALIASPROP 操作修改别名上的属性(元数据)。如果将键设置为值为空,则将删除该键。

V1 API

curl -X POST 'http://localhost:8983/admin/collections?action=ALIASPROP&name=techproducts_alias&property.foo=bar'

V2 API

curl -X PUT http://localhost:8983/api/aliases/techproducts_alias/properties -H 'Content-Type: application/json' -d '
{
  "properties": {"foo":"bar"}
}'

V2 API 通过属性级别 API 更新

curl -X PUT http://localhost:8983/api/aliases/techproducts_alias/properties/foo -H 'Content-Type: application/json' -d '
{
  "value": "baz"
}'

V2 API 通过属性级别 API 删除

curl -X DELETE http://localhost: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 获取别名上的所有属性

curl -X GET http://localhost:8983/api/aliases/techproducts_alias/properties

输出

{
  "responseHeader": {
    "status": 0,
    "QTime": 1
  },
  "properties": {
    "foo": "bar"
  }
}

V2 API 获取别名上的单个属性值

curl -X GET http://localhost:8983/api/aliases/techproducts_alias/properties/foo

输出

{
  "responseHeader": {
    "status": 0,
    "QTime": 1
  },
  "value": "bar"
}

DELETEALIAS:删除集合别名

V1 API

http://localhost:8983/solr/admin/collections?action=DELETEALIAS&name=testalias

V2 API

curl -X DELETE http://localhost:8983/api/aliases/testalias

DELETEALIAS 参数

name

必需

默认值:无

要删除的别名名称。在 v2 请求的路径中指定,并作为 v1 请求的显式请求参数指定。

async

可选

默认值:无

请求 ID 以跟踪此操作,该操作将 异步处理

DELETEALIAS 响应

输出将只是一个 responseHeader,其中包含处理请求所花费的时间的详细信息。要确认别名已删除,您可以在 Solr 管理员 UI 中的 Cloud 部分下查找 aliases.json 文件。