Archive for septembre, 2010

[PHP] Sphinx-Mysql : Un vrai moteur d’indexation

jeudi, septembre 23rd, 2010

Sphinx est un moteur de recherche full-text, distribué sous GPL v2. (Une licence commerciale est disponible)

En gros, c’est un moteur de recherche à part entière, crée pour fournir des fonctions de recherches rapides et pertinentes pour d’autres applications. Sphinx a été fait en particulier pour s’intégrer facilement avec des base de données SQL et des languages de scripts (typiquement, le couple PHP/MySQL). Pour l’instant les sources de données peuvent être des bases de donnée MySQL ou PostgreSQL, mais aussi des flux XML.

Base de donnée à indexer

Au début, nous avons donc notre base de donnée, par exemple:

CREATE TABLE items (
    item_id integer NOT NULL,
    item_title character varying(255) NOT NULL,
    item_description text NOT NULL,
    item_date timestamp without time zone NOT NULL,
    item_link character varying(255) NOT NULL,
    cat_id integer NOT NULL,
); 

On peut faire des recherches dans le titre (item_link), dans le contenu (item_description) ou dans l’url (item_link).
 En plus, il faudrais pouvoir trier par date (cat_date) ou par catégorie (cat_id)

La première étape est de créer le fichier de configuration de sphinx

Fichier de conf de base

Voila de quoi créer un sphinx.conf pour notre base de donnée

# nom de l'index : "main"
source main
{
        type            = pgsql

        sql_host        = localhost
        sql_user        = utilisateur
        sql_pass        = motdepasse
# nom de la base de donnée
        sql_db          = database   

         sql_query      = \
               SELECT item_id, cat_id, item_title, item_description, item_date,  \
                      ROUND(EXTRACT( EPOCH FROM ABSTIME(item_date) ))::int4 AS item_ts \
               FROM items                                                                                               

       sql_attr_uint                   = cat_id
       sql_attr_timestamp              = item_ts
}                                                

index main
{
        source                  = main
        path                    = /home/foo/var/lib/sphinx/main
        docinfo                 = extern
        morphology              = none
        # Cette conf de base marche bien en général
        # Pour l'adapter à vos besoins voir l'exemple de fichier de configuration complet
        enable_star             = 0
        min_word_len            = 2
        min_prefix_len          = 0
        min_infix_len           = 3
        charset_type            = utf-8
        html_strip              = 1
}

Pour indexer la base :

il faut taper la commande suivante: indexer -c sphinx.conf main (rajouter –rotate si searchdest en train d’utiliser l’index)

Suivant la taille des données à indexer cela peut prendre un peu de temps. Par exemple :

Sphinx 0.9.8.1-release (r1533)
Copyright (c) 2001-2008, Andrew Aksyonoff

using config file '/home/foo/var/sphinx.conf'...
indexing index 'main'...
collected 20786 docs, 6.8 MB
sorted 17.4 Mhits, 100.0% done
total 20786 docs, 6829246 bytes
total 9.729 sec, 701969.94 bytes/sec, 2136.57 docs/sec
rotating indices: succesfully sent SIGHUP to searchd (pid=11367).

A vos claviers ^^ .