2012-11-13 54 views
1

我有一个Ruby on rails 3.2应用程序,我尝试使用Tire和Elastic Search。Rails轮胎:导入自定义逻辑

我有了下面的声明用户模式:

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

然后我进行了记录到弹性搜索的初始导入致电:

rake environment tire:import CLASS=User FORCE=true 

是否可以自定义导入任务,从而跳过一个用户?我有一个系统用户,我不希望被索引?

回答

3

首先,Rake任务是只针对最常见的情况下,一个方便的方法,试图elasticsearch /轮胎了,等等。更复杂的情况时,你应该写自己的索引代码 - 它应该是很简单。

其次,如果你有一定的条件的记录是否被编入索引,你应该做的README指示您:不要include Tire::Model::Callbacks和自行管理索引的生命周期,例如用:

after_save do 
    update_index if state == 'published' 
end 
+0

AREN”他们两个单独的步骤? rake任务用于初始加载,当您将现有数据导入Elasticsearch时,然后回调用于更新或删除这些记录时。这似乎是我的答案的组合,并且您的答案会正确排除索引中的项目。 – Planty

+0

是的,正确的 - 但在像这样的特殊情况下,最好花时间调整自定义索引机制,参见例如。 https://github.com/karmi/tire/issues/509 – karmi

+0

谢谢,我很高兴现在我明白了。我将分两部分来解决初始加载问题,并防止正在进行的更新或新系统用户引发问题。 – Planty

1

我发现我的问题的一个粗略的解决方案,并希望发回一些东西,以防万一有人遇到此问题。如果有人有更好的建议,请告诉我。

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

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