Creare un motore di ricerca con Rails e Solr

18 novembre 2008

In una moderna applicazione Web è essenziale offrire funzionalità di ricerca evolute tra i contenuti. Un primo approccio consiste nell’utilizzare, ad esempio, le facility di ricerca messe a disposizione dal sottostante RDBMS con query del tipo:

select * from posts where body like '%foo%'

Ma questo approccio ha delle evidenti limitazioni: cosa succede se il nostro modello ha diversi campi sui quali effettuare la ricerca? E se la ricerca andasse effettuata non solo su un unico modello, ma anche su alcuni (se non tutti) i modelli ad esso direttamente collegati?

Supponiamo di avere un social network di ricette culinarie. Vogliamo offrire un comodo ed intuitivo form per la ricerca delle ricette. Ogni ricetta è rappresentata dal proprio nome, dalla descrizione, dal tempo di preparazione e da un insieme di ingredienti. Se ipotizziamo anche l’immancabile presenza dei tag diventa complicato costruire una query di ricerca su quanto appena elencato, per non parlare dell’impossibilità di prevedere query complesse!

class Recipe < ActiveRecord::Base
    has_and_belongs_to_many :tags
    
    has_and_belongs_to_many :ingredients
    
    validates_presence_of :name
    validates_presence_of :description
    validates_presence_of :preparation_time
end

class Ingredient < ActiveRecord::Base
    has_and_belongs_to_many :recipes
    validates_presence_of :name
end

class Tag < ActiveRecord::Base
    has_and_belongs_to_many :recipes
    validates_presence_of :name
end

Un’idea potrebbe consistere nel tenere, in un campo apposito, tutte le informazioni testuali legate ad una ricetta, ed aggiornarlo ogni volta che una di queste viene aggiornata… ma anche quando vengono aggiornati gli ingredienti ed i tag … impraticabile!

Solr

Solr è un motore di ricerca basato sulla libreria Lucene (già in seno ad Apache Software Foundation) e viene eseguito all’interno di un servlet container. Ma niente paura… esiste un plugin per Rails che permette di installarlo all’interno dell’applicazione corrente e di accedere alle sue (potenti) funzionalità con estrema facilità ed in brevissimo tempo.

Posto di avere un JRE 1.5 nel nostro ambiente, all’interno della nostra applicazione Rails eseguiamo il comando:

$ script/plugin install svn://svn.railsfreaks.com/projects/acts_as_solr/trunk

Tutto qui. A questo punto abbiamo un search engine integrato nella nostra applicazione Rails, occorre solo lanciarlo con il comando:

$ rake solr:start

Partirà il demone Solr in ascolto sulla porta 8982 (o 8983 in production) già configurato per accedere al nostro data base ed indicizzarlo. Ovviamente dobbiamo ancora stabilire cosa deve essere indicizzato.

Figura 1. Pannello di amministrazione di Solr
(http://localhost:8982/solr)

Pannello di amministrazione di Solr
Se vuoi aggiornamenti su Creare un motore di ricerca con Rails e Solr inserisci la tua e-mail nel box qui sotto:
 
X
Se vuoi aggiornamenti su Creare un motore di ricerca con Rails e Solr

inserisci la tua e-mail nel box qui sotto:

Ho letto e acconsento l'informativa sulla privacy

Acconsento al trattamento di cui al punto 3 dell'informativa sulla privacy