别名管理
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.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
(v1),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,该操作将异步处理。