Думающий Сфинкс и acts_as_taggable_on плагин

Я установил Сфинкса и Думающего Сфинкса для рубина на направляющих 2.3.2.

Когда я ищу без работ поиска условий хорошо. Теперь, то, что я хотел бы сделать, отфильтровать тегами, таким образом, поскольку я использую acts_as_taggable_on плагин, моя модель Announcement похожа на это:

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

Я предполагаю, что что-то неправильно, и это не ищет правильно.

Кто-либо может дать моему ключ к разгадке того, что продолжается?

Спасибо, Brian

5
задан skaffman 19 January 2010 в 22:43
поделиться

2 ответа

Мышление Сфинкса опирается на ассоциации в модели. В обычных ситуациях вам достаточно указать определение индекса ниже ваших ассоциаций.

С плагином plays_as_taggable_on у вас нет ассоциаций, связанных с тегами, в файле модели, и когда вы пишете

indexes tags.name,: as =>: tags

TS интерпретирует это например:

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

(в моем случае посмотрите sql_query в development.sphinx.conf) Я полагаю, что у вас есть имя атрибута в объявлении модели, и вы не столкнетесь с ошибкой при перестроении индекса.

Но мы ожидаем:

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 )
11
ответ дан 18 December 2019 в 08:28
поделиться

Одной из возможностей в том, что вам нужно объявить тип для Tag_IDS AS: Multi, потому что TS может запутаться (я просто обнаружил это здесь http://groups.google.com/group / dising-sphinx / browse_thread / thread / 9bd4572398f35712 / 14d4c1503f5959a9? lnk = gst & q = yanowitz # 14d4c1503f5959a9 ).

Но почему бы не использовать имена тегов для поиска? E.g.,

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 от пользовательского запроса, прежде чем использовать его).

Для отладки я бы пошел в консоль и наложил ваш запрос как можно больше (устранял аргументы на пуганицу, даже запрос (просто делать »») и т. Д.).

2
ответ дан 18 December 2019 в 08:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: