如何用条件导入索引

时间:2012-09-17 03:37:30

标签: ruby-on-rails elasticsearch tire

我的Rails 3中有一个名为Article的模型,我使用rake environment tire:import CLASS='Article' FORCE=true来做索引。但我只希望将字段deleted等于false的文章编入索引。我该如何实施呢?

3 个答案:

答案 0 :(得分:2)

您可以使用范围方法。

rake environment tire:import CLASS='Article.scoped(:conditions => {:deleted => false})' FORCE=true

参考:karmi @ https://github.com/karmi/tire/issues/458

回答

答案 1 :(得分:1)

Above Solution似乎不起作用。

我们传递给CLASS环境变量的内容仅用于查找轮胎索引并计算进度条的total。查看https://github.com/karmi/retire/blob/master/lib/tire/tasks.rb

中的Line 97: total = klass.count rescue nilLine 49: klass.tire.import(params) do |documents|

我找到的只有工作解决方案(有mongoid),

Tire.index "articles" do
   import Article.scoped(:conditions => {:deleted => false}) 
end

与karmi @ https://github.com/karmi/tire/issues/458

回答的Article.index.import( Article.scoped(:conditions => {:deleted => false}))一样好

但使用上述方法的优点是我们需要自定义映射。如下所示

Tire.index "articles" do
   import Article.scoped(:conditions => {:deleted => false}) do|documents|
     documents.map{|document| document[:content].downcase!; document}
   end
end

答案 2 :(得分:0)

在最新的Tire gem中,这对我没用。它确实在Tire v0.5.4中有效,但在v0.6.2中没有。所以,为了创建一个rake任务,我做了这个......

desc 'Index articles'
task :index => :environment do
  Article.where(:deleted => false).find_in_batches do |batch|
    Tire.index(Article.index_name).import batch
  end
end

建议在readme上使用find_in_batches。