【问题标题】:Update ElasticSearch mapping in production (Tire)更新生产环境中的 ElasticSearch 映射(轮胎)
【发布时间】:2013-02-28 17:44:51
【问题描述】:

我想对如何处理以下场景有一个清晰的认识:

我正在从 activerecord 模型中添加或删除属性,因此我想在生产环境中更新其在 ElasticSearch 中的映射。

据我了解,我应该……

1-创建一个新索引并从mysql导入所有内容

这是正确的命令吗? rake environment tire:import CLASS='Bow' INDEX='new-bows' 为了创建正确的映射,我应该已经更新了模型中的映射,对吧?

2- 删除旧映射并为new-bows 创建一个名为bows 的别名

我会那样做,对吗?

old_index_name = Bow.tire.index.name
Bow.tire.index.delete
alias = Tire::Alias.new
alias.name(old_index_name)
alias.index('new-bows')
alias.save

3-重启应用


我是否遗漏了什么,或者有没有更简单的方法可以使用轮胎实现我想要的?

我应该在什么时候删除旧索引?在创建同名别名之前,还是可以在之后创建?

【问题讨论】:

  • 嗨,我在一个有 1000 万行的模型上使用导入任务,并将大量数据转储到每条记录的索引中。粗略估计需要多少时间?我最后一次检查是 5% 花了大约 8 小时。这正常吗?
  • 你必须加载关联吗?如果是这样,请不要忘记加载它们。我认为有一个选项,否则,我建议您自己使用Tire.index(index_name).import batch 进行导入。尝试确定哪个部分可能需要更长的时间。问题可能来自您为每条记录拥有的数据量。我过去处理过数百万条记录,但它比 62.5k 记录/小时要快得多。

标签: ruby-on-rails ruby-on-rails-3 elasticsearch tire


【解决方案1】:

您应该保留旧索引,直到您确定新索引 100% 符合您的要求。如果不是这种情况,您可以将别名翻转回来。

Tire 测试套件中有一个针对“翻转别名”的集成测试。

【讨论】:

  • 抱歉耽搁了。不确定我是否了解如何测试新索引。我应该将我的应用程序指向新索引吗?因为我不能将别名命名为与现有索引相同的名称,所以...(另外,如果您可以快速定义“索引”,我会将这个术语与“索引”混淆)。谢谢:)
  • 重点是,您可以保持旧索引不变。无需删除它,除非您需要磁盘空间/等。您发布的 Ruby 代码很好,可以满足您的需求,但您需要先创建新索引:Bow.tire.create_elasticsearch_index
  • 好吧,如果我不先删除索引,我实际上无法执行alias.name(old_index_name); a.save。名称冲突。所以我需要首先将我的应用程序指向一个别名,这样我就可以翻转它,而不要理会索引,我想。
  • > 所以我首先需要将我的应用程序指向一个别名——是的,绝对是。
【解决方案2】:

向索引添加新列:

index = Tire.index("articles")

index.mapping("article", :properties => { :pinterest_shares => {:type => 'integer', :index => 'not_analyzed', :include_in_all => false} })

【讨论】:

    猜你喜欢
    • 2013-07-21
    • 2012-10-26
    • 1970-01-01
    • 2012-09-24
    • 2014-07-11
    • 2013-09-26
    • 2013-07-23
    • 1970-01-01
    • 2012-02-06
    相关资源
    最近更新 更多