Solr不删除数据重新索引方法及修改索引分析器后重索引方案
嘿,针对你提出的两个Solr重新索引相关问题,我结合实际操作经验给你详细拆解方案,确保安全又高效:
如果你想保留现有数据同时完成重新索引,最安全稳妥的方式是用新Solr Core承接重新索引的内容,完全不碰原Core的数据,具体步骤如下:
- 复制当前Core的配置文件(
managed-schema、solrconfig.xml这些核心配置)到一个新的Core目录,要是你是因为修改了配置才要重新索引,直接把修改后的配置文件放进去就行。 - 在Solr Admin后台创建新Core,或者用命令行快速创建:
solr create -c new_core_name -d /path/to/your/new/config - 从你的原始数据源(比如数据库、文件存储)重新把所有数据索引到新Core里。这个过程中原Core的业务完全不受影响,用户该查还是能查,一点不耽误。
- 等新Core索引完成,并且你验证过数据和查询结果都没问题后,再把应用的查询/写入地址切到新Core,旧Core可以先留着当备份,确认一切稳定后再处理也不迟。
另外,如果你的数据源有增量标识(比如last_updated时间戳),且不需要修改索引时分析器,也可以用增量索引+全量补漏的方式:先把所有历史数据全量导一遍,之后定期跑增量任务同步更新的数据。但要是改了索引时分析器,这个方法就没用了——旧文档的索引结构还是老的,必须全量重建。
首先得明确:修改managed-schema里的索引时分析器后,旧文档的索引不会自动更新,因为分析器逻辑只在文档被索引的那一刻生效。所以必须给所有60万文档做全量重新索引,才能让它们都用上新的分析器。考虑到你没有其他备份,核心原则就是绝对不能动原Core的数据,步骤如下:
先建一个新Core(重中之重)
复制原Core的配置文件到新目录,把你修改好的managed-schema替换进去,然后创建这个新Core。这样原Core的所有数据都在线可用,哪怕新Core出问题,业务也不会受影响。全量索引数据到新Core
- 如果数据存在外部数据源(比如MySQL、MongoDB):直接用DataImportHandler(DIH)或者你自己写的索引程序,把60万数据全量导入新Core就行。导入时多盯着点Solr日志,确保没报错。
- 如果数据只在原Solr Core里(没有外部备份):那得先从原Core导出所有文档,再导入新Core。这里千万别直接用
rows=600000一次性导出,很容易把Solr内存撑爆,要用cursorMark分页遍历:示例导出请求(用curl或者Solr Admin的查询界面都可以):
/select?q=*:*&rows=1000&wt=json&cursorMark=*每次请求后,用返回结果里的
nextCursorMark作为下一次请求的cursorMark,循环直到把所有文档都导出,再批量导入新Core。
验证新Core的正确性
索引完后,一定要做验证:比如针对你修改分析器的字段,查几个关键词,对比原Core和新Core的结果,确保新索引的数据符合预期。比如你改了分词规则,就测测分词后的查询结果对不对。切换到新Core
验证没问题后,把应用的查询和写入地址切换到新Core。原Core先别删,留个一周左右,确认业务完全稳定后再处理。(可选)优化新Core性能
全量索引后,索引段会比较多,可以在低峰时段执行优化命令合并索引段,提升查询速度:curl http://localhost:8983/solr/new_core_name/update?optimize=true注意优化会消耗不少CPU和内存,别在业务高峰跑。
内容的提问来源于stack exchange,提问作者Bhavana67

