Aller au contenu | Aller au menu | Aller à la recherche

/var/log/iksaif

samedi, décembre 27 2008

Sphinx: Indexation basique

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,                                                                                            
);

Et nous voulons 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).

Sphinx: Faire un moteur de recherche en PHP/(MySQL|PostgreSQL)

Cet article s'adresse à ceux qui auraient une (grosse) base de donnée, et qui aimeraient disposer d'un moteur de recherche rapide et performant. Une première solution est d'utiliser les index full text et de chercher directement dans la base en faisant des requêtes SQL. Cette solutions présente des avantages certains, mais aussi les désavantages suivants:

  • La taille de l'index peut rapidement devenir très importante
  • L'index peut ralentir les insertions (les insertions lockent la table sous MySQL !)
  • Les fonctions mises à dispositions par MySQL (ou PostgreSQL) en matìere de recherche full-text sont assez limitées.
  • Il faut refaire soit même le moteur de recherche qui va créer les requètes SQL

Sphinx

Sphinx

A Propos

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.

Sphinx signifie SQL Phrase Inde_x__

Programmes

  • indexer: un utilitiaire pour créer les index
  • search: a simple utilitaire (de test) pour rechercher en ligne de commandes
  • searchd: un service pour faire des recherches en utilisant sphinxapi
  • sphinxapi: un ensemple d'acpi pour les languages les plus utilisés PHP, Python, Java, Perl et Ruby.

Avantages

  • Indexation assez rapide (sur mes machines, à peu près 2000 docs/sec)
  • Support de plusieurs langues, y compris CJK
  • Il est facile de mettre le moteur de recherche sur une (voir plusieurs) machine différente et ainsi mieux répartir la charge
  • API PHP, Python, Java, Perl, et Ruby

Articles

Les articles en italique ne sont pas encore publiés

  • Configuration de base
  • Indexation
    • Indexation basique
    • Utilisation des range queries
    • Diminuer la charge du processus d'indexation: utilisation d'un index "delta"
    • Gestion de plusieurs langues
  • Tests avec l'utilitaire search
  • Utilisation de l'API PHP
  • Utilisation de l'API Python