思考Sphinx和acts_as_taggable_on插件

我在轨道2.3.2上安装了Sphinx和Thinking Sphinx for ruby​​。

当我无条件搜索时,搜索工作正常。 现在,我想做的是按标签过滤,因此,当我使用acts_as_taggable_on插件时,我的公告模型如下所示:

class Announcement  :title, :sortable => true indexes description, :as => :description, :sortable => true indexes tags.name, :as => :tags indexes category.name, :as => :category has category(:id), :as => :category_ids has tags(:id), :as => :tag_ids end 

出于某种原因,当我运行以下命令时,它只会带来一个声明,这与我的期望无关。 我有很多公告,所以我期待很多结果。

Announcement.search params[:announcement][:search].to_s, :with => {:tag_ids => 1}, :page => params[:page], :per_page => 10

我觉得有些不对劲,而且搜索不正确。

任何人都可以告诉我发生了什么事吗?

谢谢,Brian

思考Sphinx依赖于模型中的关联。 在常见情况下,您只需将索引定义放在关联下面 。

使用acts_as_taggable_on插件,您在模型文件和编写时没有与标记相关的关联

索引tags.name,:as =>:tags

TS解释如下:

 CAST(`announcements`.`name` AS CHAR) AS `tags` 

(在我的例子中查看development.sphinx.conf中的sql_query)。 我想你在模型公告中有属性名称,并且在重建索引时不会遇到错误。

但我们期望:

 CAST(GROUP_CONCAT(DISTINCT IFNULL(`tags`.`name`, '0') SEPARATOR ' ') AS CHAR) AS `tags` 

和:

 LEFT OUTER JOIN `taggings` ON (`announcements`.`id` = `taggings`.`taggable_id`) LEFT OUTER JOIN `tags` ON (`tags`.`id` = `taggings`.`tag_id`) AND taggings.taggable_type = 'Announcement' 

为了使工作正常,只需在重建索引之前在模型中添加与标记相关的关联:

 class Announcement < ActiveRecord::Base acts_as_taggable_on :tags,:category has_many :taggings, :as => :taggable, :dependent => :destroy, :include => :tag, :class_name => "ActsAsTaggableOn::Tagging", :conditions => "taggings.taggable_type = 'Announcement'" #for context-dependent tags: has_many :category_tags, :through => :taggings, :source => :tag, :class_name => "ActsAsTaggableOn::Tag", :conditions => "taggings.context = 'categories'" 

define_index方法中:

 indexes category_tags(:name), :as => :tags has category_tags(:id), :as => :tag_ids, :facet => true 

在控制器中:

 @announcement_facets = Announcement.facets params[:search], :with => {:tag_ids => [...]} @announcements = @announcement_facets.for.paginate( :page => params[:page], :per_page => 10 ) 

我发现只需定义索引:

 Class Thing < ActiveRecord::Base acts_as_taggable define_index do ..other indexing... indexes taggings.tag.name, :as => :tags end end 

工作得很好。

一种可能性是你需要将tag_ids的类型声明为:multi,因为TS可能会混淆(我刚刚发现这里http://groups.google.com/group/thinking-sphinx/browse_thread/thread/9bd4572398f35712/14d4c1503f5959a9? lnk = gst&q = yanowitz#14d4c1503f5959a9 )。

但为什么不使用标签名称进行搜索? 例如,

 Announcement.search params[:announcement][:search].to_s, :conditions => {:tags => "my_tag"}, :page => params[:page], :per_page => 10 

或者,如果您需要搜索多个标签:

 Announcement.search( "#{params[:announcement][:search].to_s} (@tags my_tag | @tags your_tag)", :page => params[:page], :per_page => 10 ) 

(除此之外,您可能希望在使用之前清除/删除用户提供的查询中的sphinx-control-characters)。

对于调试,我会进入控制台并尽可能地删除你的查询(消除分页参数,甚至查询(只做“”)等)。