使用Sunspot从Solr索引中排除草稿

时间:2010-04-28 14:22:48

标签: ruby-on-rails ruby solr sunspot

我有一个名为Article的索引模型,我不希望solr索引未发表的文章。

class Article < ActiveRecord::Base
  searchable do
    text :title
    text :body
  end
end

如何指定不是#published的文章?不应该编入索引?

3 个答案:

答案 0 :(得分:7)

请务必为已发布的状态编制索引。

class Article < ActiveRecord::Base
  searchable do
    text :title
    text :body
    boolean :is_published, :using => :published?
  end
end

然后为您的查询添加过滤器

Sunspot.search(Article) do |search|
  search.with(:is_published, true)
  # ...
end

答案 1 :(得分:7)

如果您想确保未发布的文章从不包含在搜索索引中,您可以这样做:

class Article < ActiveRecord::Base
  searchable :if => :published? do
     text :title
     text :body
  end
end

该模型将仅在发布时编入索引。

如果您还希望管理员能够搜索文章,包括未发布的文章,那么我的方法就不那么有趣了。

注意:无论article.index!参数如何,调用:if => :method都会将实例添加到索引中。

答案 2 :(得分:3)

稍微了解一下sunspot_rails的代码库,会发现一个名为maybe_mark_for_auto_indexing的方法,该方法将被添加到包含solr的模型中。您可以覆盖该方法,并根据特定模型中的条件设置@marked_for_auto_indexing。它的猴子修补,但可以帮助您解决问题。您引用的代码位于lib/sunspot/searchable.rb