【问题标题】:Rails tire:import with custom logicRails 轮胎:使用自定义逻辑导入
【发布时间】:2012-11-13 04:01:41
【问题描述】:

我有一个 Ruby on rails 3.2 应用程序,我正在尝试使用轮胎和弹性搜索。

我有一个具有以下声明的用户模型:

include Tire::Model::Search
include Tire::Model::Callbacks

然后我通过调用将记录初始导入 Elastic Search:

rake environment tire:import CLASS=User FORCE=true

是否可以自定义导入任务,使其跳过一个用户?我有一个不想被索引的系统用户?

【问题讨论】:

    标签: ruby-on-rails elasticsearch tire


    【解决方案1】:

    首先,Rake 任务只是最常见情况下的一种便捷方法,例如在尝试 elasticsearch/Tire out 等时。对于更复杂的情况,您应该编写自己的索引代码——应该很容易。

    其次,如果你对记录是否被索引有一定的条件,你应该按照自述文件的指示去做:不要include Tire::Model::Callbacks并自己管理索引生命周期,例如:

    after_save do
      update_index if state == 'published'
    end
    

    【讨论】:

    • 不是两个独立的步骤吗? rake 任务用于初始加载,当您将现有数据导入 Elasticsearch 时,回调用于更新或删除这些记录时。我的答案和你的答案似乎可以正确地从索引中排除一个项目。
    • 是的,正确 - 但在这种特殊情况下,最好花时间微调您的自定义索引机制,例如。 github.com/karmi/tire/issues/509
    • 谢谢,很高兴我现在能更好地理解这一点。我将在这两个部分中解决我的初始加载问题,并防止任何正在进行的更新或新系统用户导致问题。
    【解决方案2】:

    我为我的问题找到了一个粗略的解决方案,并想发回一些东西,以防万一其他人遇到这个问题。如果有人有更好的建议,请告诉我。

    最后我写了一个轮胎任务,调用常规的全部导入,然后从索引中删除系统帐户。

    namespace :tire do
      desc 'Create search index on User'
      task :index_users => :environment do
        ENV['CLASS'] = 'User'
        ENV['FORCE'] = 'TRUE'
        Rake::Task['tire:import'].invoke
        @user = User.find_by_type('System')
        User.tire.index.remove @user
      end
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-11
      • 1970-01-01
      • 2021-08-05
      • 1970-01-01
      • 2013-01-12
      • 2013-02-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多