Solr 4.10.3新增日期型动态字段后是否需重新索引?
针对你的Solr 4.10.3配置问题,我来逐一解答:
1. 添加date类型动态字段的正确性
没错,你要添加的这个动态字段配置是完全正确的:<dynamicField name="*_dt" type="date" indexed="true" stored="true"/>
*_dt是Solr社区通用的date类型动态字段命名约定,既符合规范也便于后续维护- 你已经确认schema中
date类型已定义,所以类型引用不存在问题 indexed="true"保证字段可被搜索,stored="true"允许字段在查询结果中返回,这两个配置是常规场景下的合理选择,也可根据你的业务需求调整
2. 配置更新的步骤(SolrCloud模式)
因为你提到了zkcli.sh,说明你使用的是SolrCloud模式,执行upconfig和linkconfig是正确的操作流程,具体命令示例如下:
更新配置集到ZooKeeper:
./zkcli.sh -zkhost <zk-host>:<port> -cmd upconfig -confdir /path/to/your/solr/config -confname your-config-set-name这里要确保
/path/to/your/solr/config是包含修改后schema.xml的配置目录,<zk-host>:<port>是你的ZK集群地址(比如localhost:2181或者集群节点地址列表)关联集合与新配置:
./zkcli.sh -zkhost <zk-host>:<port> -cmd linkconfig -collection your-collection-name -confname your-config-set-name执行完这两个命令后,SolrCloud会自动把新配置同步到各个节点,无需手动重启Solr节点(Solr会监听ZK的配置变化并自动加载)
如果是单机模式,直接替换Solr实例对应目录下的schema.xml,然后重启Solr服务即可。
3. 是否需要重新索引?以及操作方法
必须重新索引。原因是:动态字段配置仅对新写入/更新的文档生效,已经存在于集合中的文档,那些符合*_dt命名模式的字段不会被自动识别、索引和存储。只有重新索引这些文档,Solr才会按照新的动态字段规则处理对应的字段。
重新索引的常见方法有两种:
方法一:使用DataImportHandler(DIH)全量导入
如果你的数据是通过DIH从数据库或其他数据源导入的,直接触发全量导入即可:
curl "http://<solr-host>:<port>/solr/<collection-name>/dataimport?command=full-import&clean=true"
clean=true会先清空现有索引再导入新数据,保证数据一致性;若不想清空现有数据,可去掉该参数,但可能会产生重复数据,需根据你的需求选择
方法二:导出现有文档再重新导入
如果没有使用DIH,或者数据来自其他渠道,可以先导出集合中的所有文档,再重新提交回Solr:
导出文档:
curl "http://<solr-host>:<port>/solr/<collection-name>/select?q=*:*&rows=1000000&wt=json&fl=*" > all_docs.jsonrows参数需设置为大于集合中文档总数的值,确保能导出所有数据;若文档量极大,建议分页导出fl=*表示导出所有字段,包含原始字段
批量提交导入:
将导出的all_docs.json整理为Solr批量提交格式(或直接使用Solr的Post工具):./post.jar -c <collection-name> all_docs.json注意:Solr 4.10.3的Post工具通常是
post.jar,具体路径需根据你的安装目录调整
注意事项
- 重新索引前建议先做集合备份,避免数据丢失:
curl "http://<solr-host>:<port>/solr/<collection-name>/replication?command=backup&location=/path/to/safe/backup/dir" - 若集合分片较多,重新索引时可考虑逐个分片处理,或调整Solr的导入参数(如
commitWithin)避免性能问题
内容的提问来源于stack exchange,提问作者Fabrizio67

