5

我正在使用 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 进行部署,因此我可以自动完成我成功使用的三个步骤,而不会遇到太多麻烦。但是我是弹性搜索和轮胎的新手,所以我认为我很可能会滥用两者或使事情变得不必要的困难。

4

1 回答 1

5

这里有几点:

  • Tire 尝试在类加载时创建具有正确映射的索引
  • 但是当模型已经存在时, Tire 不会尝试为模型创建索引

那么,您的问题实际上更多是关于正确的工作流程吗?当你部署一个新版本的应用程序时,你不应该重新填充索引,就像你不从某种备份重新填充数据库一样。

自动检查符合模型中当前定义的索引映射当然是可能的(比较MyModel.tire.index.mappingwith MyModel.tire.mapping,如果不同则重新填充等),这是我要小心的事情。

开发人员通常知道她何时更改了映射并应该重新索引数据。删除索引并重新填充也意味着搜索停机,对于大型应用程序甚至不可行。

my-index-2012-12更好的解决方案是在导入数据时使用特定的索引名称,并my-index为该索引指定一个别名。然后,您可以自由地重新填充索引,并在完成后翻转别名,而无需停机。Tire 会努力在这种工作流程中为您提供支持(Rake 导入任务等)。

于 2012-12-12T20:44:10.073 回答