我想要更改模式中的一些字段类型,所以它似乎必须使用这种更改重新索引当前Solr索引数据中的所有文档。
问题是关于如何“重新索引”所有文档? 我能想到的一个解决方案是通过搜索界面“查询”所有文档并将大型文件转储为XML或JSON,然后将其转换为Solr的输入XML格式,并再次将其加载回Solr以进行架构更改发生。
有更好的方法可以更有效地做到这一点吗?谢谢你的建议。
答案 0 :(得分:12)
首先,如果您有已编制索引但未存储的字段,则转储查询结果可能无法提供原始数据。通常,最好将输入的副本保存为一个表单,您可以根据需要轻松地从头开始重建索引。在这种情况下,只需发布<delete><query>*:*</query></delete>
然后<commit/>
然后<optimize/>
来运行删除查询。之后,您的索引为空,您可以添加使用新架构的新文档。
但是,在使用新架构文件重新启动SOLR后,您可能只需运行<optimize/>
即可。最好有一个备份,你可以测试它是否适用于你的配置。
有一个名为Luke的工具可用于浏览和导出Lucene索引。我自己从未尝试过,但它可以帮助您导出数据,以便重新导入数据。
答案 1 :(得分:2)
转储查询的所有结果的想法可能会为您提供不完整或无效的数据,因为您可能无法显示索引中的所有数据。
虽然将索引副本保存在可以重新插入的表单中的想法在数据不会更改的情况下运行良好,但是当您添加新字段时会变得更加复杂到架构。在这种情况下,您需要从源收集所有数据,格式化数据以匹配新架构,然后插入它。
答案 2 :(得分:2)
如果Solr中的文档数量很大,并且您需要保持Solr服务器可用于查询,则可以启动索引作业以在后台重新添加/重新索引文档。
引入一个新字段以保留每个文档的lastindexed时间戳是有帮助的,因此在任何索引/重新索引问题的情况下,可以识别等待重新索引文档。
为了改善查询的延迟,可以使用配置参数来保存每次提交后的缓存。
答案 3 :(得分:0)
有一个PHP script可以做到这一点:获取并重新插入所有Solr文档,重新索引它们。
为了优化,请从命令行调用:
curl http://<solr_host>:<port>/solr/<core_name>/update -F stream.body=' <optimize />'