Condividi su Facebook
Sphinx ~ un motore di ricerca semplice ed efficiente
Scritto da: Monska il 04/09/2012 alle 11:35
Tag: PHP, Linux, Informatica, Motori di ricerca.Visto 1562 volte.


Sphinx Search Server

Spesso è volentieri ci è capitato di imbatterci nel rognoso problema della gestione di un motore di ricerca di alcuni dati presenti su una base dati. Questa attività viene spesso richiesta per progetti di natura web per rendere la navigazione più facile e indirizzare facilmente l'utente verso i contenuti di suo interesse.
Il software che vi presentiamo è un motore di ricerca full text in grado di indicizzare grosse quantità di dati e di gestire gli indici con una rapidità veramente notevole.

Cosa può fare Sphinx
Come anticipato, Sphinx è un motore di ricerca FULL TEXT. Il suo compito è quello di "leggere" PER INTERO i documenti che gli vengono forniti e generare degli indici che gli permetteranno di fornire delle risposte in base alle keyword che gli vengono passate. Può essere utilizzato per indicizzare documenti sotto forma di file, o, come vedremo in questo articolo, di indicizzare dei dati presenti su una base dati.
ATTENZIONE
Le risposte che questo motore di ricerca può fornire sono formate dai soli ID documento NUMERICI e dai relativi attributi specificati nel file di configurazione. È necessario quindi che ogni documento sia identificato UNIVOCAMENTE da un numero, e ad ogni documento possono essere correlati degli attributi di tipo numerico o di tipo data (unix timestamp). Recentemtente sono state introdotte altre tipologie di attributi dei quali però non abbiamo mai fatto uso. Se siete interessati a maggiori dettagli relativi alla gestione di attributi vi rimandiamo alla sezione di documentazione del progetto che trovate a questo link.

Utilizzare Sphinx
L'utilizzo che noi abbiamo fatto di Sphinx è stato puramente quello per progetti di natura WEB. La comodità è rappresentata dalla presenza della libreria SphinxClient nel linguaggio PHP. Nonostante la documentazione a volte incompleta presente ad oggi sul sito PHP.NET, i metodi sono facilmente comprensibili e l'utilizzo è davvero semplice.

L'aspetto che abbiamo riscontrato molto interessante di questo software Open Source, è che i processi autori della ricerca sono due:
1. un processo di indicizzazione che serve proprio alla generazione dei file di indice
2. un processo SERVER, in ascolto sulla porta di default 9312, che fornisce i risultati attinenti alle parole cercate

Entrando più nel dettaglio avremo il processo di lettura e ranking dei dati, che partendo dalle source dei dati stessi, produce dei file binari che verranno utilizzati dal processo server per fornire le risposte.
Quindi sarà per noi sufficiente configurare in maniera corretta le source dei dati per poter gestire facilmente il nostro motore di ricerca.

Il file di configurazione
Il file di configurazione, che generalmente viene posizionato nella cartella

Code:

/etc/sphinx/sphinx.conf

si articola in quattro sezioni fondamentali:
1. le source
2. gli indici
3. i parametri di configurazione del processo di indicizzazione
4. i parametri di configurazione del processo server che fornisce le risposte

Le source
Per definire una source, che utilizza dei dati presenti su una base dati, è sufficiente dare le seguenti direttive:

Code:

source src_articoli
{
   type         = mysql

   sql_host      = <mysql host>
   sql_user      = <mysql user>
   sql_pass      = <mysql password>
   sql_db         = <mysql database>
   sql_port      = <mysql port>
   # QUESTE DIRETTIVE LE ABBIAMO AGGIUNTE PER GESTIRE DATI IN UTF-8
   sql_query_pre       = SET CHARACTER_SET_RESULTS=utf8
   sql_query_pre       = SET NAMES utf8
   
   # QUESTA È LA QUERY CHE PRODURRÀ IL VERO RESULTSET
   # COME SI PUÒ NOTARE IL PRIMO CAMPO È L'ID CHE SPHINX USERÀ COME ID DOCUMENTO
   sql_query      = SELECT id, titolo, testo, UNIX_TIMESTAMP(creation_date) AS creation_date FROM articoli
   
   sql_attr_timestamp   = creation_date
   
   # POSSONO ESSERE SPECIFICATI DEI CAMPI DI JOIN ATTRAVERSO LA DIRETTIVA sql_joined_field
   # È NECESSARIO CHE IL PRIMO CAMPO DELLA QUERY SIA L'ID A CUI SPHINX DEVE APPLICARE LA JOIN
   # IL RISULTATA SARÀ CHE AD OGNI ARTICOLO PRESENTE VERRÀ INSERITO ANCHE L'AUTORE CORRELANDO
   # CORRELANDO LA QUERY INIZIALE A QUELLA DI JOIN ATTRAVERSO I DUE ID
   # (SI PUÒ APPLICARE LA JOIN ANCHE DIRETTAMENTE ALLA QUERY PRINCIPALE)
   sql_joined_field    = author_name from query;
            SELECT articoli.id, autori.nome
               FROM articoli JOIN autori ON articoli.autore=autori.id
   
   # QUESTA È LA QUERY CHE VIENE ESEGUITA PER MOSTRARE UN ESTRATTO DEI RISULTATI
   sql_query_info      = SELECT id, titolo FROM articoli WHERE id=$id
}


Avendo definito una sorgente di questo tipo, è ora possibile utilizzarla in più indici. Tale operazione è poco utilizzata poichè in genere a indici differenti corrispondono source differenti.

Gli indici
La definizione degli indici ci permette di configurare la posizione del file di indice, la sorgente dell'indice e altre direttive di trasformazione, charset o minima lunghezza. Ecco la porzione di file di configurazione relativa alla gestione degli indici:

Code:

index articoli
{
   # DEFINIAMO LA SORGENTE DA UTILIZZARE
   source         = src_articoli
   # DEFINIAMO LA POSIZIONE DEI FILE DI INDICE
   path         = /var/lib/sphinx/articoli
   docinfo         = extern
   charset_type      = utf-8
   # DEFINIAMO LA TRASFORMAZIONE IN UTF-8 DEI CARATTERI
   charset_table       = 0..9, A..Z->a..z, _, a..z,
                     U+410..U+42F->U+430..U+44F, U+430..U+44F,
                     U+00E0->a,U+00E1->a,U+00E8->e,U+00E9->e,U+00EC->i,U+00ED->i,U+00F2->o,U+00F3->o,U+00F9->u,U+00FA->u
   # DEFINIAMO LA LUNGHEZZA MINIMA DELLE PAROLE DA CERCARE
   # IN CASO DI PAROLE PIÙ CORTE NON SARANNO MOSTRATI RISULTATI
   # ATTENZIONE: LUNGHEZZE TROPPO RIDOTTE PRODUCONO MOLTI RISULTATI NON PERTINENTI
   min_word_len      = 3
}

Parametri di configurazione indexer
L'unico paramentro di configurazione che abbiamo trovato utile è stato quello per tarare il limite di RAM utilizzabile dal processo.
La porzione di file di configurazione risulta quindi essere la seguente:

Code:

indexer
{
   mem_limit      = 32M
}

Parametri di configurazione searchd
In questa sezione del file di cofnigurazione è possibile gestire la porta di ascolto del servizio, i file di log, il file di processo e altre configurazioni relative al processo searchd. Ecco la sezione di file di configurazione riguardante il servizio:

Code:

searchd
{
   # PORTA SU CUI IL SERVIZIO SARÀ IN ASCOLTO
   port         = 9312
   # FILE DI LOG DEL PROCESSO SEARCHD
   log         = /var/log/sphinx/searchd.log
   # FILE DI LOG DELLE RICERCHE
   query_log      = /var/log/sphinx/query.log
   read_timeout      = 5
   max_children      = 30
   pid_file      = /var/run/sphinx/searchd.pid
   max_matches      = 1000
   seamless_rotate      = 1
   preopen_indexes      = 0
   unlink_old      = 1
}

La fase di indicizzazione
Una volta completata la configurazione delle sorgenti e degli indici, non ci resta che effettuare il processo di generazione dei file di indice. Questa procedura può avvenire in due modi differenti:
1. Con questa modalità si ha un downtime del servizio dovuto alla rigenerazione e la rilettura dei file di indice che avviene fermando e riattivando il servizio. Se il tempo per la generazione degli indici è sufficientemente piccolo, e la variabilità dei dati ci permette di effettuare questo breve downtime in momenti di inutilizzo del servizio, questa soluzione permette un minor utilizzo di RAM e quindi un contenuto spreco di risorse.
I comandi che devono essere lanciati per ricreare i file di indice sono:

Code:

# searchd --stop
# indexer articoli
# searchd

2. La seconda modalità ci permette di effettuare reindicizzazioni senza avere tempi di disservizio. Tale procedura, per poter funzionare, occupa per un certo periodo un quantitativo di RAM maggiore. Il processo tiene salvati in RAM gli indici vecchi, in modo che il servizio possa continuare a funzionare, compila e carica in RAM i nuovi indici e segnala al servizio che i nuovi indici sono pronti all'uso. Solo quando searchd inizia ad utilizzare i nuovi indici la RAM viene svuotata dagli indici vecchi. Il comando da lanciare per utilizzare questa modalità è:

Code:
# indexer --rotate --all

Come si può notare uno dei parametri che può essere passato al comando indexer è --all che ci permette di riginerare TUTTI GLI INDICI.

Una volta configurato correttamente tutto il servizio, e compilati gli indici, possiamo provare ad effettuare direttamente dalla shell una ricerca di prova attraverso il comando:

Code:

$ search <keyword>
...
displaying matches:
1. document=40, weight=2
   id=40
   titolo=Questo è il titolo del tuo articolo
...

Come si può notare la parte effettiva di risposta è composta dall'ID del documento affiancato dal un peso generato, e come aiuto all'identificazione del documento, Sphinx esegue la query definita come sql_query_info nella sezione dedicata alla sorgente.

Per ulteriori parametri che possono essere passati al comando search, modalità di ricerca e ordinamenti vi rimandiamo al sito ufficiale che offre una ricca documentazione.

Buona ricerca a tutti.


Aggiungi un commento:
Nick:
captchaInserire il codice:





Licenza Creative Commons

Blog CodiceASbarre.Net di CodiceASbarre.Net sotto licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 3.0 Italia License.
Lavoro basato su www.codiceasbarre.net.
Ulteriori permessi in merito questa licenza possono essere richiesti a info@codiceasbarre.net.


Link ad altri blog: