Domanda

Ho installato Sfinge e Thinking Sphinx per Ruby on Rails 2.3.2.

Quando cerco senza condizioni di ricerca funziona bene. Ora, quello che mi piacerebbe fare è Filtra tramite tag, così, come io sto usando il plugin acts_as_taggable_on, il mio modello Annuncio assomiglia a questo:

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, che porterà solo un annuncio, che non ha nulla a che fare con quello che mi aspetto. Ho molti annunci, quindi mi aspettavo un sacco di risultati, invece.

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

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

Qualcuno può dare il mio un indizio di quello che sta succedendo?

Grazie, Brian

È stato utile?

Soluzione

Thinking Sphinx si basa su associazioni a modello. In situazioni comuni devi solo mettere indice di definizione sotto vostre associazioni.

acts_as_taggable_on plug-in non si dispone di associazioni tag correlati nel file del modello e quando si scrive

  

indici tags.name,: come =>: i tag

TS lo interpreta come:

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

(vedi sql_query in development.sphinx.conf, nel mio caso). Suppongo che si deve attribuire nome nel modello di annuncio e non incorrere in errore quando ricostruire l'indice.

Ma ci aspettiamo che:

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 index:

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

Nel 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 )

Altri suggerimenti

ho scoperto che semplicemente definendo l'indice in tal modo:

Class Thing < ActiveRecord::Base    

acts_as_taggable

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

ha funzionato bene.

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 la ricerca? Per es.,

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

In alternativa, se avete bisogno di cercare più i tag:

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 di utilizzarlo).

Per il debug, vorrei andare in consolle e smontare la vostra richiesta, per quanto possibile (eliminare argomenti impaginazione, anche la query (basta fare ""), ecc.).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top