我在Rails 2.3.2上安装了Sphinx和Think Sphinx for ruby。
当我无条件搜索时,搜索正常。现在,我想做的是按标签过滤,因此,当我使用acts_as_taggable_on插件时,我的“公告”模型如下所示:
class Announcement < ActiveRecord::Base
acts_as_taggable_on :tags,:category
define_index do
indexes title, :as => :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
我猜有些地方出了问题,而且搜索不正确。
任何人都可以告诉我发生了什么事吗?
谢谢,
布赖恩
最佳答案
思维 sphinx 依赖于模型中的关联。在通常情况下,您只需要将索引定义below放在您的关联中即可。
使用插件上的 actions_as_taggable_,您在模型文件中以及编写时没有与标签相关的关联
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
在 Controller 中:@announcement_facets = Announcement.facets params[:search], :with => {:tag_ids => [...]}
@announcements = @announcement_facets.for.paginate( :page => params[:page], :per_page => 10 )
关于ruby-on-rails - 思维 sphinx 和act_as_taggable_on插件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2082399/