Indexation de vos Models

Tout ce qui concerne les indexes pour vos models va dans la méthode define_index à l’intérieur de votre model.

class Article < ActiveRecord::Base
  # ...
  
  define_index do
    indexes subject, :sortable => true
    indexes content
    indexes author(:name), :as => :author, :sortable => true
    
    has author_id, created_at, updated_at
  end
  
  # ...
end

Les Champs

La méthode indexes ajoute un (ou plusieurs) champs, faisant référence à vos noms de colonne du model.

indexes content

Gardez à l’esprit que si vous référencé une colonne qui partage son nom avec une méthode Ruby (comme par exemple id, name ou type), vous allez avoir besoin de le spécifier à l’aide d’un symbole.

indexes :name

Cependant vous n’avez pas besoin de garder les mêmes noms que dans la base de données. Utilisez le mot clé :as pour signier l’alias.

indexes content, :as => :post

Vous pouvez également définir un champ comme étant triable.

indexes subject, :sortable => true

Si il y a des associations dans votre model, vous pouvez acceder aux autres colonnes. Un alias est obligatoirement requis quand on veux faire ça.

indexes author(:name), :as => :author
indexes author.location, :as => :author_location

Les Attributs

La méthode has ajoute un (ou plusieurs) attributs, et tout comme la méthode indexes, celà nécessite le bon accord des noms de colonne du model.

has author_id

La syntaxe est très proche de la configuration des champs. Vous pouvez définir des alias, acceder aux associations. Cependant vous n’avez pas besoin de définir un attribut comme étant :sortable – dans Sphinx, tous les attributs peuvent être utilisés comme étant triable.

has tags(:id), :as => :tag_ids

Traitement des indexes

Une fois que vous avez configurés vos indexes comme vous le vouliez, vous pouvez lancer la tâche rake pour dire à Sphinx de traiter les données.

rake thinking_sphinx:index

Lorsque le model sera traité, vous verrez un message du type ci-dessous. C’est juste un avertissement, pas une erreur. Tout ira bien.

distributed index 'article' can not be directly indexed; skipping.

Cependant, si vous faite une modification de structure à votre index (ce qui veux dire tout sauf l’ajout de données dans les tables de la base de données), vous aurez alors besoin d’arreter Sphinx, réindexer, et de le redémarrer.

rake thinking_sphinx:stop
rake thinking_sphinx:index
rake thinking_sphinx:start