为已存储数据的模型重新加载轮胎/弹性搜索映射

wil*_*mas 5 ruby-on-rails mongomapper chef-infra elasticsearch tire

我正在使用Tire和elasticsearch在MongoMapper模型上提供搜索功能,这是Rails应用程序的一部分.我只是偶然发现了一个问题,当我重新部署到使用以下配置的环境(在config/environments/env_name.rb中)时,此模型的映射没有更新:

config.cache_classes = true
Run Code Online (Sandbox Code Playgroud)

单独重新加载类似乎没有解决问题(也许可以理解,新的映射可能与我猜的现有数据不兼容?).相反,我必须做以下事情:

MyModel.index.delete
<restart the app or reload the class>
MyModel.index.import MyModel.all
Run Code Online (Sandbox Code Playgroud)

我只是想知道是否有更好的方法a).确保我的模型代码中定义的最新映射在每次部署后由elasticsearch使用,但b).避免用完整的数据集重新填充索引?

我们通常使用Chef进行部署,因此我可以自动完成我成功使用的三个步骤而不会有太多麻烦.但我是弹性研究的新手,所以我认为我很可能会误用两者或者让事情变得不必要.

kar*_*rmi 5

几点在这里:

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

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

自动检查符合当前定义模型中的索引映射当然是可能的(比较MyModel.tire.index.mappingMyModel.tire.mapping如果不同,再填充,等等),它的东西,我会小心的事情.

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

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