banniere.png

Indexation facile et rapide avec Xapian

J'en avais parlé il y a quelques mois, Xapian est très simple à utiliser et à mettre en oeuvre pour des besoins légers d'indexation. Malgré son API très orientée page html (chaque document indexé l'est avec le contenu de la page), l'outil peut être utilisé pour fournir un moteur de recherche light rapide. Le système de Query qui pêchait encore il y a quelque temps (combinaisons limitées) est maintenant plus complet.

Xapian s'installe très facilement, ainsi que son binding Python (voir site)

J'avais besoin d'un petit moteur pour un site que je suis en train de monter en Django. Voici le principe mise en oeuvre:

  • Création d'une base de type Flint
  • Indexation de documents
  • Recherches simples AND ou OR

La base est créé par l'API flint_open:
>>> import xapian
>>> DB = xapian.flint_open('file.db', xapian.DB_CREATE_OR_OPEN)
Puis chaque document est indexé par la création d'un Document et un appel successif à ses méthodes add_term et add_posting, sachant que set_data n'est pas utilisé dans notre cas.

  • set_data permet de définir le contenu du document à stocker, puisque le moteur prend aussi en charge les données.
  • add_posting permet de stocker les mots-clefs associés au document, qui permettent de le retrouver dans une recherche.
  • add_term est utilisé pour stocker la clé unique, préfixée d'un 'Q'

Pour des besoins simples d'indexation, set_data se contente de stocker un identifiant unique, comme un uuid ou une url:
>>> uri = '111'
>>> doc = xapian.Document()
>>> doc.add_term('Q%s' % uri, 1)
Enfin, chaque mot est associé au document avec add_posting:
>>> i = 1
>>> for word in ('cat', 'pussy', 'cool'):
... doc.add_posting(word, i)
... i += 1
Puis le document ajouté à la base:
>>> DB.add_document(doc)

La recherche est ensuite effectuée par le biais d'un object Query:
>>> enquire = xapian.Enquire(DB)
>>> query = xapian.Query('pussy')
>>> enquire.set_query(query)
>>> res = enquire.get_mset(0, 100)
>>> res[0].document.termlist().next().term[1:]
'111'

Les API delete_document et replace_document permettent aussi de gérer la réindexation, en retrouvant le document déjà indexé par le biais d'une recherche sur le term qui sert de clef.

Xapian fourni également des tokenizers pour faciliter le travail d'extraction des mots à associer au document. J'utilise pour ma part un tokenizer maison plus paramétrable.

Si vous avez envie d'utiliser Xapian pour un projet Python, n'hésitez pas à récupérer le paquet (embryon en cours de conception) que j'ai fait sur mon repository. Il gère l'indexation, la réindexation, la suppression, etc.

Repo (cliquer sur manifest, puis aller dans 'xap'):  http://hg.programmation-python.org/repositories/public/

Il fournit une API extrêment simple à mettre en oeuvre. (c.f. le doctest dans doc/db.txt)

Feedback welcome !


Vous aimez ce post ? partagez-le :


Trackback URL | Categories: coding, django 0 comments - add

Tarek Ziadé. Copyright 2006. Tous droits réservés. Licence contenu site
BuzTrucs
Add to Technorati Favorites