2010-01-17 9 views
5

Ho installato Sfinge e Sphinx di pensiero per rubino su rotaia 2.3.2.Thinking Sfinge e act_as_taggable_on plug-in

Quando eseguo una ricerca senza condizioni, la ricerca funziona correttamente. Ora, quello che mi piacerebbe fare è Filtra tramite tag, così, come io sto usando il plugin acts_as_taggable_on, il mio modello Annuncio simile a questa:

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 

Per qualche ragione, quando ho eseguito il seguente comando, porterà solo un annuncio, che non ha nulla a che fare con ciò che mi aspetto. Ho molti annunci, quindi mi aspettavo un sacco di risultati.

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

immagino che qualcosa non va, e non è la ricerca in modo corretto.

Qualcuno può darmi un'idea di cosa sta succedendo?

Grazie, Brian

risposta

11

La Sfinge del pensiero si basa su associazioni nel modello. Nelle situazioni comuni devi solo inserire la definizione dell'indice below le tue associazioni.

Con acts_as_taggable_on plug-in non si hanno le associazioni tag correlati al file del modello e quando si scrive

indici tags.name,: come =>: tag

TS lo interpreta come:

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

(guardare sql_query in development.sphinx.conf, nel mio caso). Suppongo che tu abbia il nome dell'attributo nel modello Announcement e non si verifichino errori durante la ricostruzione dell'indice.

ma ci aspettiamo:

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

e:

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' 

Per far funzionare le cose basta aggiungere le associazioni tag correlati nel modello prima di ricostruire indice:

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'" 

In define_index metodo:

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

In controllore:

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

Una possibilità è che è necessario dichiarare il tipo per tag_ids come: più perché TS può confondersi (ho appena scoperto questo qui http://groups.google.com/group/thinking-sphinx/browse_thread/thread/9bd4572398f35712/14d4c1503f5959a9?lnk=gst&q=yanowitz#14d4c1503f5959a9).

Ma perché non utilizzare i nomi dei tag per cercare? Ad esempio,

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

Oppure, se avete bisogno di cercare più tags:

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

(come a parte, si può decidere di igienizzare/rimuovere sfinge-controllo-caratteri della query fornita dall'utente prima usandolo).

Per il debug, vorrei andare in console e rimuovere la query il più possibile (eliminare gli argomenti di impaginazione, anche la query (basta fare ""), ecc.).

6

ho trovato che semplicemente definendo l'indice così:

Class Thing < ActiveRecord::Base  

acts_as_taggable 

    define_index do 
     ..other indexing... 
     indexes taggings.tag.name, :as => :tags 
    end 
end 

funzionava bene.

+0

Grazie, ha funzionato alla grande. –

Problemi correlati