繁体   English   中英

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

[英]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 的新手,所以我认为我很可能滥用了两者或使事情变得不必要地困难。

这里有几点:

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

因此,您的问题实际上更多是关于正确的工作流程? 部署新版本的应用程序时,不应以不从某种备份中重新填充数据库的方式重新填充索引。

当然可以自动检查是否符合模型中当前定义的索引映射(将MyModel.tire.index.mappingMyModel.tire.mapping进行比较,如果不同则重新填充等),这是我会警惕的事情。

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

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

您可以通过Tire尝试使用此Update elasticsearch设置

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM