思考Sphinx和acts_as_taggable_on插件

Bri*_*tul 5 sphinx ruby-on-rails acts-as-taggable thinking-sphinx

我在轨道2.3.2上安装了Sphinx和Thinking 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
Run Code Online (Sandbox Code Playgroud)

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

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

我想有些事情是错的,并且没有正确搜索.

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

谢谢,Brian

Vol*_*ldy 11

思维狮身人面像依赖于模特中的联想.在常见情况下,您只需将索引定义放在关联下面.

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

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

TS解释如下:

CAST(`announcements`.`name` AS CHAR) AS `tags`
Run Code Online (Sandbox Code Playgroud)

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

但我们期望:

CAST(GROUP_CONCAT(DISTINCT IFNULL(`tags`.`name`, '0') SEPARATOR ' ') AS CHAR) AS `tags`
Run Code Online (Sandbox Code Playgroud)

和:

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'
Run Code Online (Sandbox Code Playgroud)

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

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'"
Run Code Online (Sandbox Code Playgroud)

define_index方法中:

indexes category_tags(:name), :as => :tags
has category_tags(:id), :as => :tag_ids, :facet => true
Run Code Online (Sandbox Code Playgroud)

在控制器中:

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


MrT*_*rus 6

我发现只是简单地定义索引:

Class Thing < ActiveRecord::Base    

acts_as_taggable

     define_index do
        ..other indexing...
        indexes taggings.tag.name, :as => :tags
     end
end
Run Code Online (Sandbox Code Playgroud)

工作得很好.