概述
集合是使用单个Solr配置文件(solrconfig.xml
)和单个索引模式的单一逻辑索引。集合管理命令为SolrCloud提供了完整的集合生命周期管理功能,包括创建、修改、删除、备份、恢复等核心操作。
本指南中的所有示例假设你正在运行”techproducts” Solr示例:
1 | bin/solr start -c -e techproducts |
CREATE:创建集合
CREATE操作用于创建新的数据集合。
API调用方式
V1 API:
1 | http://localhost:8983/solr/admin/collections?action=CREATE&name=techproducts_v2&collection.configName=techproducts&numShards=1 |
V2 API:
1 | curl -X POST http://localhost:8983/api/collections -H 'Content-Type: application/json' -d '{ |
CREATE 参数详解
基础参数
name
- 类型:必需
- 说明:要创建的集合名称
router.name
- 类型:可选
- 默认值:
compositeId
- 说明:路由器名称,定义文档如何在分片间分布
implicit
:不自动路由文档,需要明确指定分片compositeId
:基于唯一键字段值哈希分布文档- 使用
implicit
路由器时需要shards
参数 - 使用
compositeId
路由器时需要numShards
参数
numShards
- 类型:可选
- 说明:作为集合一部分创建的分片数量。当
router.name
为compositeId
时此参数为必需
shards (v1) / shardNames (v2)
- 类型:可选
- 说明:创建集合时使用的分片名称。当
router.name
为implicit
时此参数为必需 - 格式:
- V1:逗号分隔的字符串,如
shard-x,shard-y,shard-z
- V2:数组形式,如
["shard-x", "shard-y", "shard-z"]
- V1:逗号分隔的字符串,如
副本配置参数
replicationFactor
- 类型:可选
- 默认值:
1
- 说明:为每个分片创建的副本数量,创建NRT类型副本
nrtReplicas
- 类型:可选
- 说明:创建的NRT(近实时)副本数量。维护事务日志并本地更新索引
tlogReplicas
- 类型:可选
- 说明:创建的TLOG副本数量。维护事务日志但只通过从领导者复制更新索引
pullReplicas
- 类型:可选
- 说明:创建的PULL副本数量。不维护事务日志,只通过从领导者复制更新索引。不能成为领导者
节点分布参数
createNodeSet (v1) / nodeSet (v2)
- 类型:可选
- 说明:定义新集合分布的节点
- 格式:
- V1:逗号分隔,如
localhost:8983_solr,localhost:8984_solr
- V2:数组形式,如
["localhost:8983_solr", "localhost:7574_solr"]
- V1:逗号分隔,如
- 特殊值:V1可使用
EMPTY
初始不创建副本,后续通过ADDREPLICA添加
createReplicas (v2)
- 类型:可选
- 默认值:
true
- 说明:控制是否在集合创建过程中创建副本。仅V2 API可用
createNodeSet.shuffle (v1) / shuffleNodes (v2)
- 类型:可选
- 默认值:
true
- 说明:控制分片副本是否按顺序分配到指定节点,还是先打乱节点列表
配置参数
collection.configName (v1) / config (v2)
- 类型:可选
- 说明:要用于此集合的配置名称(必须已存储在ZooKeeper中)
- 默认行为:如果未提供,Solr使用
_default
配置集创建名为<collectionName>.AUTOCREATED
的新配置集
router.field (v1) / router (v2)
- 类型:可选
- 说明:如果指定,路由器将查看输入文档中此字段的值来计算哈希并识别分片,而非查看
uniqueKey
字段
perReplicaState
- 类型:可选
- 默认值:
false
- 说明:如果为
true
,单个副本的状态将作为state.json
的单独子项维护
高级参数
property.name=value
- 类型:可选
- 说明:设置核心属性。这是专家级选项,应谨慎使用
waitForFinalState
- 类型:可选
- 说明:如果为
true
,请求将仅在所有受影响的副本变为活跃时完成
alias
- 类型:可选
- 说明:创建集合时同时创建指向此集合的别名
async
- 类型:可选
- 说明:异步处理此操作的请求ID
集合首先以读写模式创建,但可以使用MODIFYCOLLECTION操作设置为只读模式。
RELOAD:重载集合
当你在ZooKeeper中更改了配置文件(如上传新的solrconfig.xml
)时使用RELOAD操作。Solr会自动重载某些通过ZooKeeper监视的文件(如security.json
),但对于配置集中的文件更改,需要手动触发RELOAD。
API调用方式
V1 API:
1 | http://localhost:8983/solr/admin/collections?action=RELOAD&name=techproducts_v2 |
V2 API:
1 | curl -X POST http://localhost:8983/api/collections/techproducts_v2/reload -H 'Content-Type: application/json' -d '{ |
RELOAD 参数
name
- 类型:必需
- 说明:要重载的集合名称
async
- 类型:可选
- 说明:异步处理此操作的请求ID
MODIFYCOLLECTION:修改集合属性
可以同时编辑多个属性。更改这些值仅更新ZooKeeper上的znode,不会更改集合的拓扑。例如,增加replicationFactor
不会自动向集合添加更多副本,但会允许更多ADDREPLICA命令成功。
API调用方式
V1 API:
1 | http://localhost:8983/solr/admin/collections?action=MODIFYCOLLECTION&collection=techproducts_v2&replicationFactor=2 |
V2 API:
1 | curl -X POST http://localhost:8983/api/collections/techproducts_v2 -H 'Content-Type: application/json' -d '{ |
MODIFYCOLLECTION 参数
collection
- 类型:必需
- 说明:要修改的集合名称
attribute=value
- 类型:必需
- 说明:属性名称和属性值的键值对。可修改的属性包括:
replicationFactor
collection.configName
readOnly
- 使用
property.
前缀的其他自定义属性
async
- 类型:可选
- 说明:异步处理此操作的请求ID
只读模式
将readOnly
属性设置为true
会将集合置于只读模式,此时任何索引更新请求都将被拒绝。其他集合级操作(如添加/删除/移动副本)在此模式下仍可用。
从读写到只读模式的转换包括以下步骤:
- 在集合状态中更改
readOnly
标志 - 任何新的更新请求都将被拒绝并返回403 FORBIDDEN错误(正在进行的长时间运行请求也将被中止)
- 执行强制提交以刷新和提交任何正在进行的更新
- 执行集合RELOAD操作
移除readOnly
属性或将其设置为false可启用更新处理并重新加载集合。
LIST:列出集合
获取集群中集合的名称。
API调用方式
V1 API:
1 | http://localhost:8983/solr/admin/collections?action=LIST |
V2 API:
1 | curl -X GET http://localhost:8983/api/collections |
响应示例
1 | { |
RENAME:重命名集合
重命名集合设置一个指向底层集合的标准别名,使得同一个(未修改的)集合现在可以在查询、索引和管理操作中使用新名称引用。
此命令实际上并不重命名底层Solr集合——它使用新名称设置新的一对一别名,或重命名现有别名以使其使用新名称,同时仍引用同一底层Solr集合。
API调用方式
V1 API:
1 | http://localhost:8983/solr/admin/collections?action=RENAME&name=techproducts_v2&target=newName |
V2 API:
1 | curl -X POST http://localhost:8983/api/collections/techproducts/rename -H 'Content-Type: application/json' -d '{ |
RENAME 限制和参数
限制条件
- 现有名称必须是SolrCloud集合或引用单个集合的标准别名
- 引用超过1个集合的别名不受支持
- 现有名称不能是路由别名
- 目标名称不能是现有别名
参数说明
name
- 类型:必需
- 说明:现有SolrCloud集合名称或引用单个集合的别名名称
target (v1) / to (v2)
- 类型:必需
- 说明:集合的目标名称。这将是引用底层SolrCloud集合的新别名
RENAME 示例
假设有两个实际的SolrCloud集合collection1
和collection2
,以及以下现有别名:
col1 => collection1
col2 => collection2
simpleAlias => col1
(解析为collection1
)compoundAlias => col1,col2
(解析为collection1,collection2
)
将col1
重命名为foo
后,别名将变为:
foo => collection1
col2 => collection2
simpleAlias => foo
(解析为collection1
)compoundAlias => foo,col2
(解析为collection1,collection2
)
DELETE:删除集合
DELETE操作用于删除集合。
API调用方式
V1 API:
1 | http://localhost:8983/solr/admin/collections?action=DELETE&name=techproducts_v2 |
V2 API:
1 | curl -X DELETE http://localhost:8983/api/collections/techproducts_v2 |
异步删除:
1 | curl -X DELETE http://localhost:8983/api/collections/techproducts_v2?async=aaaa |
DELETE 参数
name
- 类型:必需
- 说明:要删除的集合名称
async
- 类型:可选
- 说明:异步处理此操作的请求ID
COLLECTIONPROP:集合属性管理
添加、编辑或删除集合属性。
API调用方式
V1 API:
1 | http://localhost:8983/solr/admin/collections?action=COLLECTIONPROP&name=techproducts_v2&propertyName=propertyName&propertyValue=propertyValue |
V2 API 创建或更新属性:
1 | curl -X PUT http://localhost:8983/api/collections/techproducts_v2/properties/foo -H 'Content-Type: application/json' -d '{ |
V2 API 删除属性:
1 | curl -X DELETE http://localhost:8983/api/collections/techproducts_v2/properties/foo |
COLLECTIONPROP 参数
name (v1)
- 类型:可选
- 说明:要设置属性的集合名称
propertyName (v1)
- 类型:可选
- 说明:属性名称
propertyValue (v1) / value (v2)
- 类型:可选
- 说明:属性值。在v1请求中未提供时,属性将被删除
MIGRATE:文档迁移
MIGRATE命令用于将具有给定路由键的所有文档迁移到另一个集合。源集合将继续保持相同数据,但在forward.timeout
参数指定的秒数内,它将开始将写请求重新路由到目标集合。
API调用方式
V1 API:
1 | http://localhost:8983/solr/admin/collections?action=MIGRATE&collection=techproducts_v2&split.key=key1!&target.collection=postMigrationCollection&forward.timeout=60 |
V2 API:
1 | curl -X POST http://localhost:8983/api/collections/techproducts_v2 -H 'Content-Type: application/json' -d '{ |
MIGRATE 参数
collection
- 类型:必需
- 说明:将要分割文档的源集合名称
target.collection (v1) / target (v2)
- 类型:必需
- 说明:文档将迁移到的目标集合名称
split.key (v1) / splitKey (v2)
- 类型:必需
- 说明:路由键前缀。例如,如果文档的uniqueKey是”a!123”,那么你应该使用
split.key=a!
forward.timeout (v1) / forwardTimeout (v2)
- 类型:可选
- 默认值:60秒
- 说明:对于给定
split.key
的写请求将转发到目标分片的超时时间(秒)
async
- 类型:可选
- 说明:异步处理此操作的请求ID
MIGRATE 注意事项
- 这是长时间运行的操作,强烈建议使用
async
参数 - 此命令仅适用于使用compositeId路由器的集合
- 目标集合在MIGRATE命令运行期间不得接收任何写入,否则可能丢失某些写入
- MIGRATE API不对文档执行去重操作
REINDEXCOLLECTION:重新索引集合
REINDEXCOLLECTION命令使用源集合的现有数据重新索引集合。
API调用方式
V1 API:
1 | http://localhost:8983/solr/admin/collections?action=REINDEXCOLLECTION&name=techproducts_v2 |
注意:当前没有V2 API等效操作。
REINDEXCOLLECTION 参数
name
- 类型:必需
- 说明:源集合名称,可以是别名
cmd
- 类型:可选
- 默认值:
start
- 支持的命令:
start
:如果尚未运行则开始处理abort
:中止已运行的重新索引(或清除崩溃后的遗留状态),并删除部分结果status
:返回正在运行的重新索引命令的详细状态
target
- 类型:可选
- 说明:目标集合名称。如果未指定,将生成唯一名称,复制所有文档后创建从源集合名称指向唯一命名集合的别名
q
- 类型:可选
- 默认值:
*:*
- 说明:选择要重新索引的文档的查询
fl
- 类型:可选
- 默认值:
*
- 说明:要重新索引的字段列表
rows
- 类型:可选
- 默认值:
100
- 说明:传输文档的批大小
configName / collection.configName
- 类型:可选
- 默认值:源集合名称
- 说明:目标集合的配置集名称
removeSource
- 类型:可选
- 默认值:
false
- 说明:如果为
true
,处理成功完成后将删除源集合
async
- 类型:可选
- 说明:异步处理此操作的请求ID
REINDEXCOLLECTION 注意事项
- 重新索引是可能有损的操作
- 目标集合必须不存在(且不能是别名)
- 重新索引启动时,源集合将设置为只读模式
- 重新索引作为流式表达式守护进程执行
- 通常是耗时操作,建议作为异步请求执行
COLSTATUS:集合索引详细状态
COLSTATUS命令提供集合状态的详细描述,包括段和字段数据的低级索引信息。
API调用方式
V1 API:
1 | http://localhost:8983/solr/admin/collections?action=COLSTATUS&collection=techproducts_v2&coreInfo=true&segments=true&fieldInfo=true&sizeInfo=true |
V2 API:
1 | curl -X GET "http://localhost:8983/api/collections/techproducts_v2?coreInfo=true&segments=true&fieldInfo=true&sizeInfo=true" |
COLSTATUS 参数
collection
- 类型:可选
- 说明:集合名称。如果缺失,返回所有集合信息(仅v1请求支持)
coreInfo
- 类型:可选
- 默认值:
false
- 说明:如果为
true
,将提供分片领导者的SolrCore附加信息
segments
- 类型:可选
- 默认值:
false
- 说明:如果为
true
,将提供段信息
fieldInfo
- 类型:可选
- 默认值:
false
- 说明:如果为
true
,将提供详细的Lucene字段信息及其对应的Solr模式类型
sizeInfo
- 类型:可选
- 默认值:
false
- 说明:如果为
true
,将提供索引文件大小和RAM使用情况的附加信息
索引大小分析工具
COLSTATUS命令还提供用于分析和估算原始索引数据组成的工具。此工具应谨慎使用,因为它会在所有分析集合的分片领导者上产生大量IO负载。
rawSize
- 类型:可选
- 默认值:
false
- 说明:如果为
true
,运行原始索引数据分析工具
rawSizeSummary
- 类型:可选
- 默认值:
false
- 说明:如果为
true
,还包括按字段和按类型的数据大小的更详细细分
rawSizeDetails
- 类型:可选
- 默认值:
false
- 说明:如果为
true
,提供详细统计信息,包括每字段每类型的项目统计分布以及每字段前20个最大项目
rawSizeSamplingPercent
- 类型:可选
- 默认值:
5.0
- 说明:当索引大于某个阈值(每分片100k文档)时,只检索和分析部分数据以减少IO负载
备份和恢复
BACKUP:备份集合
将Solr集合和相关配置备份到”备份存储库”。
API调用方式
V1 API:
1 | http://localhost:8983/solr/admin/collections?action=BACKUP&name=techproducts_backup&collection=techproducts&location=file:///path/to/my/shared/drive |
V2 API:
1 | curl -X POST http://localhost:8983/api/collections/techproducts/backups/techproducts_backup/versions -H 'Content-Type: application/json' -d '{ |
BACKUP 参数
collection
- 类型:必需
- 说明:要备份的集合名称
name
- 类型:必需
- 说明:要创建的备份名称
location
- 类型:必需
- 说明:备份命令写入的共享驱动器位置
async
- 类型:可选
- 说明:异步处理此操作的请求ID
repository
- 类型:可选
- 说明:用于备份的存储库名称。如果未指定则自动使用本地文件系统存储库
maxNumBackupPoints
- 类型:可选
- 说明:备份位置应保留的备份数量上限
backupConfigset
- 类型:可选
- 默认值:
true
- 说明:指示是否应在索引备份中包含配置集文件
incremental
- 类型:可选
- 默认值:
true
- 说明:选择创建增量备份还是”完整”备份
indexBackup (v1) / backupStrategy (v2)
- 类型:可选
- 默认值:
copy-files
- 说明:备份策略,可选值为
copy-files
和none
RESTORE:恢复集合
从指定备份将Solr索引和相关配置恢复到指定集合。
API调用方式
V1 API:
1 | curl -X GET http://localhost:8983/solr/admin/collections?action=RESTORE&name=techproducts_backup&location=file:///path/to/my/shared/drive&collection=techproducts_v3 |
V2 API:
1 | curl -X POST http://localhost:8983/api/backups/techproducts_backup/restore -H 'Content-Type: application/json' -d '{ |
RESTORE 参数
collection
- 类型:必需
- 说明:索引将恢复到的集合
name
- 类型:必需
- 说明:要恢复的现有备份名称
location
- 类型:可选
- 说明:RESTORE命令从中读取的备份存储库中的位置
repository
- 类型:可选
- 说明:用于备份的存储库名称
backupId
- 类型:可选
- 说明:要从中恢复的特定备份点的ID
async
- 类型:可选
- 说明:异步处理此操作的请求ID
LISTBACKUP:列出备份
列出存储在指定存储库位置的每个备份的信息。
API调用方式
V1 API:
1 | http://localhost:8983/solr/admin/collections?action=LISTBACKUP&name=myBackupName&location=/path/to/my/shared/drive |
V2 API:
1 | curl -X GET "http://localhost:8983/api/backups/backupName/versions?location=/path/to/my/shared/drive" |
DELETEBACKUP:删除备份文件
从远程存储库删除备份文件。
API调用方式
按备份ID删除:
1 | # V1 API |
删除除最近N个备份外的所有备份:
1 | # V2 API |
快照管理
CREATESNAPSHOT:创建集合快照
Solr支持创建集合”快照”,”检查点”集合状态,以便用户可以在需要时稍后恢复到该点。这在重新索引或对集合进行配置更改之前特别有用。
API调用方式
V1 API:
1 | http://localhost:8983/solr/admin/collections?action=CREATESNAPSHOT&collection=techproducts&commitName=snapshot0 |
V2 API:
1 | curl -X POST http://localhost:8983/api/collections/techproducts/snapshots/snapshot0 -H 'Content-Type: application/json' -d '{ |
CREATESNAPSHOT 参数
collection
- 类型:必需
- 说明:要为其创建快照的集合名称
snapshot
- 类型:必需
- 说明:要为集合创建的快照名称
followAliases
- 类型:可选
- 默认值:false
- 说明:将集合参数视为要解析的实际集合名称的别名的标志
async
- 类型:可选
- 说明:异步处理此操作的请求ID
LISTSNAPSHOTS:列出集合快照
列出集合的所有快照。
API调用方式
V1 API:
1 | http://localhost:8983/solr/admin/collections?action=LISTSNAPSHOTS&collection=techproducts |
V2 API:
1 | curl -X GET http://localhost:8983/api/collections/techproducts/snapshots |
DELETESNAPSHOT:删除集合快照
删除指定集合的快照。
API调用方式
V1 API:
1 | http://localhost:8983/solr/admin/collections?action=DELETESNAPSHOT&collection=techproducts&commitName=snapshot0 |
V2 API:
1 | curl -X DELETE http://localhost:8983/api/collections/techproducts/snapshots/snapshot0 |
REBALANCELEADERS:重新平衡领导者
根据活跃节点上的preferredLeader属性重新分配集合中的领导者。
API调用方式
V1 API:
1 | http://localhost:8983/solr/admin/collections?action=REBALANCELEADERS&collection=techproducts |
V2 API:
1 | curl -X POST http://localhost:8983/api/collections/techproducts -H 'Content-Type: application/json' -d '{ |
REBALANCELEADERS 参数
collection
- 类型:必需
- 说明:要重新平衡preferredLeaders的集合名称
maxAtOnce
- 类型:可选
- 说明:同时排队的最大重新分配数量
maxWaitSeconds
- 类型:可选
- 默认值:60秒
- 说明:等待领导者重新分配的超时时间
最佳实践建议
集合设计
- 合理设置分片数量:根据数据量和查询负载确定分片数量
- 副本类型选择:根据查询模式选择合适的副本类型(NRT、TLOG、PULL)
- 配置集管理:使用有意义的配置集名称,便于维护
备份策略
- 定期备份:建立定期备份计划,使用增量备份节省存储空间
- 备份验证:定期验证备份的完整性和可恢复性
- 存储位置:使用可靠的共享存储,确保所有节点可访问
运维管理
- 异步操作:对大规模操作使用async参数避免超时
- 监控集合状态:使用COLSTATUS监控集合健康状况
- 快照管理:在重大变更前创建快照,便于快速回滚
性能优化
- 领导者平衡:在大型集群中使用REBALANCELEADERS分散负载
- 只读模式:在数据迁移期间合理使用只读模式
- 节点分布:合理配置createNodeSet实现负载均衡
这些集合管理命令为SolrCloud提供了完整的集合生命周期管理功能,正确使用这些命令可以确保集合的高可用性、数据安全性和最佳性能。