别名管理
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.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
输入
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
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 以跟踪此操作,该操作将 异步处理。
列出别名属性
检索与指定别名关联的元数据属性。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 以跟踪此操作,该操作将 异步处理。