[英]reloading tire/elasticsearch mappings for a model that already has data stored
我正在使用 Tire 和 elasticsearch 在 MongoMapper 模型上提供搜索功能,该模型是 Rails 应用程序的一部分。 我只是偶然发现了一个问题,当我重新部署到使用以下配置的环境(在 config/environments/env_name.rb 中)时,此模型的映射没有更新:
config.cache_classes = true
单独重新加载类似乎并没有解决问题(也许可以理解,我猜新映射可能与现有数据不兼容?)。 相反,我必须执行以下操作:
MyModel.index.delete
<restart the app or reload the class>
MyModel.index.import MyModel.all
我只是想知道是否有更好的方法 a)。 确保每次部署后,elasticsearch 都使用我的模型代码中定义的最新映射,但 b)。 避免使用完整数据集不必要地重新填充索引?
我们通常使用 Chef 进行部署,因此我可以自动执行我成功使用的三个步骤,而不会遇到太多麻烦。 但是我是 elasticsearch 和 Tire 的新手,所以我认为我很可能滥用了两者或使事情变得不必要地困难。
这里有几点:
因此,您的问题实际上更多是关于正确的工作流程? 部署新版本的应用程序时,不应以不从某种备份中重新填充数据库的方式重新填充索引。
当然可以自动检查是否符合模型中当前定义的索引映射(将MyModel.tire.index.mapping
与MyModel.tire.mapping
进行比较,如果不同则重新填充等),这是我会警惕的事情。
开发人员通常知道她何时更改了映射,应该重新索引数据。 删除索引,然后重新填充也意味着搜索停机,甚至对于大型应用程序也不可行。
更好的解决方案是在导入数据时使用特定的索引名称,例如my-index-2012-12
,并将my-index
别名指向该索引。 然后,您可以自由地重新填充索引,完成后翻转别名,而无需停机。 Tire会尽力在这种工作流程中为您提供支持(Rake导入任务等)。
您可以通过Tire尝试使用此Update elasticsearch设置
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.