Je stocke depuis quelques années les messages provenant de listes de diffusion de sécurité. Ces messages sont stokés dans un unique dossier qui peut être interrogé par ce formulaire :
La durée de recherche est variable, elle dépasse souvent 60 secondes. Désolé du délais, il faudra que je mette en place un dossier indexé.
La recherche est effectuée sur le corp des messages et non les sujets ou en-têtes. Le langage est strict mais intuitif, voici quelques exemples en guise d'explication :
"and" implicite :
J'ai écrit un petit programme en python me permettant d'effectuer des recherches sur mon dossier de sécurité. Je souhaitais pouvoir avoir un langage de requète avancé et surtout totalement indépendant du langage de recherche de IMAP4. Cette abstraction a été faite pour éviter les risques d'injection de commandes imap, mais également pour pouvoir interroger d'autres sous-systèmes qu'imap.
Comme j'ai mis en place le formulaire sur mon site pour mon propre usage, autant faire en sorte que d'autres personnes en profitent (même si leur nombre est infime :-)
Mon programme utilise une implémentation de lex et yacc écrite en python : ply. L'analyseur grammatical transforme ma requète en un Abre Syntaxique Abstrait (AST). Cet abre est ensuite transformé en une chaine de recherche IMAP4.
La grammaire que j'ai définie pour le langage de recherche est la suivante :
expression : expression AND term
| expression OR term
| term
term : NOT term
| QWORDS
| WORD
| LPAREN expression RPAREN
Pour plus de détails, voir les sources.