Solr部署:别名管理
集合别名是Solr与普通集合相同对待的虚拟集合。
别名集合可以指向一个或多个真实集合。
集合别名的一些使用场景:
- 时间序列数据
- 在后台重新索引内容
有关Solr中别名的概述,请参见别名部分。
CREATEALIAS:为集合创建或修改别名
CREATEALIAS
操作将创建指向一个或多个集合的新别名。
别名有两种类型:标准别名和路由别名。
标准别名很简单:CREATEALIAS
用命令提供的一个或多个集合的名称注册别名名称。
如果现有别名存在,它将被替换/更新。
标准别名可以作为重命名集合的手段,也可以用于原子地交换哪个支持/底层集合对各种目的来说是”活跃的”。
当Solr搜索指向多个集合的别名时,Solr将搜索所有集合的所有分片作为聚合整体。
虽然可以向跨越多个集合的别名发送更新,但标准别名没有在引用集合之间分发文档的逻辑,因此所有更新都将发送到列表中的第一个集合。
/admin/collections?action=CREATEALIAS&name=_name_&collections=_collectionlist_
路由别名是具有额外功能的别名,可以作为一种超级集合,将更新路由到正确的集合。
路由是数据驱动的,可以基于时间字段或字段中指定的类别(通常基于字符串)。
在开始之前,请参见路由别名获取一些重要的高级信息。
1 | $ 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
的初始集合。
发送到此别名的更新,如果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
之外的任何参数。
所有其他字段在要求和命名上都是相同的,除了我们坚持明确指定配置集。
配置集必须事先创建、上传或复制和修改。
使用”数据驱动”模式可能是个坏主意,因为模式变化可能同时发生,导致错误。
在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):
评估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):
文档在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:
输入:
1 | http://localhost:8983/solr/admin/collections?action=CREATEALIAS&name=testalias&collections=foo,bar&wt=xml |
输出:
1 | <response> |
V2 API:
输入:
1 | curl -X POST http://localhost:8983/api/aliases -H 'Content-Type: application/json' -d ' |
输出:
1 | { |
一个有些人为的示例,演示了使用许多额外集合创建选项创建TRA。
V1 API:
输入:
1 | http://localhost:8983/solr/admin/collections?action=CREATEALIAS |
输出:
1 | <response> |
V2 API:
输入:
1 | curl -X POST http://localhost:8983/api/aliases -H 'Content-Type: application/json' -d ' |
输出:
1 | { |
另一个示例,这次是维度路由别名,演示如何为单个维度指定参数:
V1 API:
输入:
1 | http://localhost:8983/solr/admin/collections?action=CREATEALIAS |
输出:
1 | <response> |
V2 API:
输入:
1 | curl -X POST http://localhost:8983/api/aliases -H 'Content-Type: application/json' -d ' |
输出:
1 | { |
LISTALIASES:集群中所有别名的列表
V1 API:
1 | curl -X GET 'http://localhost:8983/solr/admin/collections?action=LISTALIASES' |
V2 API:
1 | curl -X GET http://localhost:8983/api/aliases |
LISTALIASES获取单个别名的详细信息
V2 API:
1 | curl -X GET http://localhost:8983/api/aliases/testalias2 |
LISTALIASES响应
输出将包含别名列表及相应的集合名称。
使用LISTALIASES的示例
列出现有别名
输入:
1 | curl -X GET http://localhost:8983/api/aliases |
输出:
1 | { |
获取单个别名的详细信息
输入:
1 | curl -X GET http://localhost:8983/api/aliases/testalias2 |
输出:
1 | { |
ALIASPROP:修改别名属性
ALIASPROP
操作修改别名的属性(元数据)。
如果键设置为空值,它将被删除。
V1 API:
1 | curl -X POST 'http://localhost:8983/admin/collections?action=ALIASPROP&name=techproducts_alias&property.foo=bar' |
V2 API:
1 | curl -X PUT http://localhost:8983/api/aliases/techproducts_alias/properties -H 'Content-Type: application/json' -d ' |
V2 API通过属性级别api更新:
1 | curl -X PUT http://localhost:8983/api/aliases/techproducts_alias/properties/foo -H 'Content-Type: application/json' -d ' |
V2 API通过属性级别api删除:
1 | 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获取别名上的所有属性:
1 | curl -X GET http://localhost:8983/api/aliases/techproducts_alias/properties |
输出:
1 | { |
V2 API获取别名上的单个属性值:
1 | curl -X GET http://localhost:8983/api/aliases/techproducts_alias/properties/foo |
输出:
1 | { |
DELETEALIAS:删除集合别名
V1 API:
1 | http://localhost:8983/solr/admin/collections?action=DELETEALIAS&name=testalias |
V2 API:
1 | curl -X DELETE http://localhost:8983/api/aliases/testalias |
DELETEALIAS参数
name:
要删除的别名的名称。在v2请求的路径中指定,在v1请求中作为显式请求参数。
async:
请求ID来跟踪将异步处理的操作。
DELETEALIAS响应
输出将只是一个responseHeader,包含处理请求所用时间的详细信息。
要确认别名的删除,您可以在Solr管理UI的Cloud部分查找aliases.json
文件。