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

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

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

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

务必索引已发布的状态。

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

然后在查询中添加一个filter

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

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

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

然后,该模型仅在发布时编制索引。

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

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

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