Bonjour, après avoir reconsidéré les besoins et les fonctions nécessaires à l'indexation et la recherche d'éléments, nous avons pensé utiliser Lucene pour l'implantation de la base de donnée. Les données ont été décomposées en trois groupes : * les meta-données de chaque élément, permettant de l'identifier, de connaître son type, son parent en version, etc * le contenu indexé, provenant d'une librairie, de résultat, etc. C'est sur ce contenu que la recherche full text sera faite * les données à proprement parler, qui sont stockées sur le système de fichier. On conserve dans ces fichiers les meta données, afin de permettre la reconstruction d'une base à partir d'un dossier. Lucene fonctionne par document indexé. Chaque document a des champs, associant à un libellé une valeur. Cette valeur peut être indexée et/ou stockée. Un document peut avoir plusieurs champs avec le même nom. Nous stockons ainsi les meta données dans des champs prédéfinis, et le contenu à indexer dans un champ non stocké. Une fois les documents indexés, la recherche peut se faire sur des champs de meta donnée afin de récuperer un élément en particulier, ou sur le champ indexé. Cette dernière recherche permet des requêtes textuelles complexes, en autorisant les jokers, les opérateurs booléens, etc. Afin de valider ce choix, nous avons procédé à différents tests, notamment de montée en charge. Ainsi, un test a créé une base de 25 000 documents, contenant chacun entre 10 000 et 30 000 mots d'un dictionnaire de 150 000 mots (entre 2 et 7 lettres). Soit au total environ 11Gb de données indexées. L'index en lui même pèse 3Gb, le contenu n'étant pas stocké. L'ajout atomique de document et la recherche ne pose pas de problème de performance, Lucene étant suffisamment mature et la transformation entre un document et des méta données simple. La principale difficulté se trouvent dans la gestion des fichiers d'index. Une fois que ceux ci sont ouvert en lecture, Lucene conserve un index correspondant au lecteur au moment de son ouverture, tout en laissant la possibilité de continuer l'indexation. Afin de conserver la cohérence entre ce qui est lu et ce qui est écrit, le lecteur est invalidé lors de l'écriture de données. Lors de la première lecture après une écriture, une ouverture d'un nouvel index est réalisé, et est pratiquement immédiat. Les recherches full texte sur deux caractères (type eu*) sont assez rapides (150 à 200ms), le plus long étant la récupération des document depuis l'index, en récupérant tous ses champs associés (3ms par document). Un avantage majeur de Lucene est aussi son aspect portable, il peut être exécuter sur le poste client ou sur le serveur sans problème. L'implantation du moteur Lucene se base sur l'interface Database ci jointe. Ainsi, si vous n'y voyez pas d'objection, Lucene sera utilisé pour stocker les meta données. Cordialement, Gabriel -------------- section suivante -------------- Une pièce jointe non texte a été nettoyée... Nom: fr_cemagref_simexplorer_is_storage_database_classes.png Type: image/png Taille: 4887 octets Desc: non disponible Url: https://lists.labs.libre-entreprise.org/mailman/private/simexplorer-si-devel...
Le Monday 17 December 2007 11:17:21 Gabriel Landais a écrit :
Bonjour,
Bonjour,
Afin de valider ce choix, nous avons procédé à différents tests, notamment de montée en charge. Ainsi, un test a créé une base de 25 000 documents, contenant chacun entre 10 000 et 30 000 mots d'un dictionnaire de 150 000 mots (entre 2 et 7 lettres). Soit au total environ 11Gb de données indexées. L'index en lui même pèse 3Gb, le contenu n'étant pas stocké.
Qu'en est-il de cet index ? Doit-il être maintenu en mémoire ?
Les recherches full texte sur deux caractères (type eu*) sont assez rapides (150 à 200ms), le plus long étant la récupération des document depuis l'index, en récupérant tous ses champs associés (3ms par document).
Ça semble effectivement raisonnable.
Ainsi, si vous n'y voyez pas d'objection, Lucene sera utilisé pour stocker les meta données.
Merci pour cette note. En dehors de ma question sur la taille de l'index, nous n'avons pas d'objection. Lucene a fait ses preuves et à la vue de votre analyse, il nous paraît un bon choix technologique. Cordialement -- Nicolas Dumoulin Ingénieur d?études - Cemagref, LISC +33 (0)4.73.44.07.29 -------------- section suivante -------------- Une pièce jointe non texte a été nettoyée... Nom: non disponible Type: application/pgp-signature Taille: 189 octets Desc: This is a digitally signed message part. Url: https://lists.labs.libre-entreprise.org/mailman/private/simexplorer-si-devel...
Nicolas Dumoulin a écrit :
Afin de valider ce choix, nous avons procédé à différents tests, notamment de montée en charge. Ainsi, un test a créé une base de 25 000 documents, contenant chacun entre 10 000 et 30 000 mots d'un dictionnaire de 150 000 mots (entre 2 et 7 lettres). Soit au total environ 11Gb de données indexées. L'index en lui même pèse 3Gb, le contenu n'étant pas stocké.
Qu'en est-il de cet index ? Doit-il être maintenu en mémoire ?
L'index est constitué d'un seul dossier contenant des segments d'index. Les données présentent en mémoire sont les documents ajoutés qui n'ont pas encore été commités. Ce commit peut être déclenché si le nombre de documents en mémoire dépasse une constante (implantation par Lucene), ou lors de l'appel explicite de l'appel du commit de Database (implanté dans LuceneDatabase). Le premier ne provoque pas l'invalidation des lecteurs en cours. Les segments écrits sur le disque ne sont pas utilisé par les nouvelles requêtes. Le second écrit lui aussi les données mais crée un nouveau lecteur afin de rendre visible les données aux requêtes suivantes. De plus, il ferme les lecteurs ouverts à la fin des requêtes en cours. Lucene permet le stockage de l'index dans différentes implémentation de Directory. Nous utilisons FSDirectory afin d'écrire les données sur le disque, mais il existe une implantation RAMDirectory afin de conserver l'index en mémoire. Je n'ai pas exploré cette voie, la base devant être persistée, afin de ne pas recréer l'index à chaque ouverture de l'application. Cdt, Gabriel
Le Monday 17 December 2007 12:15:47 Gabriel Landais a écrit :
Nicolas Dumoulin a écrit :
Afin de valider ce choix, nous avons procédé à différents tests, notamment de montée en charge. Ainsi, un test a créé une base de 25 000 documents, contenant chacun entre 10 000 et 30 000 mots d'un dictionnaire de 150 000 mots (entre 2 et 7 lettres). Soit au total environ 11Gb de données indexées. L'index en lui même pèse 3Gb, le contenu n'étant pas stocké.
Qu'en est-il de cet index ? Doit-il être maintenu en mémoire ?
L'index est constitué d'un seul dossier contenant des segments d'index. Les données présentent en mémoire sont les documents ajoutés qui n'ont pas encore été commités. Ce commit peut être déclenché si le nombre de documents en mémoire dépasse une constante (implantation par Lucene), ou lors de l'appel explicite de l'appel du commit de Database (implanté dans LuceneDatabase). Le premier ne provoque pas l'invalidation des lecteurs en cours. Les segments écrits sur le disque ne sont pas utilisé par les nouvelles requêtes. Le second écrit lui aussi les données mais crée un nouveau lecteur afin de rendre visible les données aux requêtes suivantes. De plus, il ferme les lecteurs ouverts à la fin des requêtes en cours.
Merci pour ces éclaircissements.
Lucene permet le stockage de l'index dans différentes implémentation de Directory. Nous utilisons FSDirectory afin d'écrire les données sur le disque, mais il existe une implantation RAMDirectory afin de conserver l'index en mémoire. Je n'ai pas exploré cette voie, la base devant être persistée, afin de ne pas recréer l'index à chaque ouverture de l'application.
FSDirectory semble approprié dans notre contexte. -- Nicolas Dumoulin Ingénieur d?études - Cemagref, LISC +33 (0)4.73.44.07.29 -------------- section suivante -------------- Une pièce jointe non texte a été nettoyée... Nom: non disponible Type: application/pgp-signature Taille: 189 octets Desc: This is a digitally signed message part. Url: https://lists.labs.libre-entreprise.org/mailman/private/simexplorer-si-devel...
participants (2)
-
landais@codelutin.com -
nicolas.dumoulin@cemagref.fr