1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
|
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 24249 -->
<!-- Reviewed: no -->
<sect1 id="learning.lucene.index-structure">
<title>Structure d'index Lucene</title>
<para>
Afin d'utiliser l'intégralité des fonctionnalités de
<classname>Zend_Search_Lucene</classname> avec un maximum de performances, il est
nécessaire que vous compreniez la structure interne d'un index.
</para>
<para>
Un <emphasis>index</emphasis> est stocké dans un ensemble de fichier au sein d'un
seul répertoire.
</para>
<para>
Un <emphasis>index</emphasis> est un ensemble indépendant de
<emphasis>segments</emphasis> dans lesquels sont stockées des informations au sujet d'un
sous-ensemble de documents indexés. Chaque <emphasis>segment</emphasis> a son propre
<emphasis>dictionnaire de terme</emphasis>, son propre index de dictionnaire de terme, et
son propre stockage de document (valeur de champ stocké)
<footnote>
<para>Depuis Lucene 2.3, les fichiers de stockage de document peuvent être partagés
entre les segments; cependant, <classname>Zend_Search_Lucene</classname> n'utilise pas
cette possibilité</para>
</footnote>.
Toutes les informations de segments sont stockées dans un fichier
<filename>_xxxxx.cfs</filename>, où <emphasis>xxxxx</emphasis> est le nom d'un
segment.
</para>
<para>
Dès qu'un fichier de segment d'index est créé, il ne peut être mis à jour. De
nouveaux documents sont ajoutés à de nouveaux segments. Les documents supprimés sont
seulement marqués comme supprimés dans un fichier facultatif
<filename><segmentname>.del</filename>.
</para>
<para>
La mise à jour de document est effectuée en tant qu'opérations distincts de
suppression et d'ajout, même si elle est effectuée en utilisant un appel à
l'<acronym>API</acronym> <methodname>update()</methodname>
<footnote>
<para>Cet appel est fourni uniquement par Java Lucene pour le moment, mais il est prévu
d'étendre l'<acronym>API</acronym> <classname>Zend_Search_Lucene</classname> avec une
fonctionnalité similaire</para>
</footnote>.
Ceci simplifie l'ajout de nouveaux documents, et permet de mettre à jour
simultanément à l'aide des opérations de recherche.
</para>
<para>
D'un autre coté, utiliser plusieurs segments (avoir un document par segment est un
cas exceptionnel) augmente le temps de recherche :
</para>
<itemizedlist>
<listitem>
<para>
La récupération d'un terme depuis le dictionnaire est effectué pour chaque
segment ;
</para>
</listitem>
<listitem>
<para>
Le dictionnaire de terme de l'index est préchargé pour chaque segment (ce
processus occupe la plupart du temps de recherche pour de simples requêtes et
nécessite aussi de la mémoire supplémentaire).
</para>
</listitem>
</itemizedlist>
<para>
Si les termes du dictionnaires de recherche atteignent un point de saturation, la
recherche à travers un segment est <emphasis>N</emphasis> fois plus rapide que la recherche
à travers <emphasis>N</emphasis> segments dans la plupart des cas.
</para>
<para>
<emphasis>L'optimisation d'index</emphasis> fusionne deux segments ou plus en un
segment unique. Un nouveau segment est ajouté à la liste des segments de l'index, et les
anciens segments sont exclus.
</para>
<para>
La mise à jour de la liste de segments s'effectue de manière atomique. Ceci donne la
capacité d'ajouter de nouveaux documents simultanément, d'effectuer des optimisations
d'index, et de chercher à travers l'index.
</para>
<para>
L'auto-optimisation d'index s'effectue après chaque génération de segment. Elle
fusionne l'ensemble des plus petits segments en des segments plus grands, et les segments
plus grands en des segments encore plus grands, si nous avons suffisamment de segments à
fusionner.
</para>
<para>L'auto optimisation d'index est contrôlé par trois options :</para>
<itemizedlist>
<listitem>
<para>
<emphasis>MaxBufferedDocs</emphasis> (Le nombre minimal de documents requis
avant que les documents mis en mémoire tampon soit écrits dans un nouveau
segment) ;
</para>
</listitem>
<listitem>
<para>
<emphasis>MaxMergeDocs</emphasis> (Le plus grand nombre de documents
fusionnés par une opération d'optimisation) ; et
</para>
</listitem>
<listitem>
<para>
<emphasis>MergeFactor</emphasis> (qui détermine la fréquence à laquelle les
indices de segments sont fusionnés par les opérations d'auto-optimisation).
</para>
</listitem>
</itemizedlist>
<para>
Si nous ajoutons un documents par exécution de script,
<emphasis>MaxBufferedDocs</emphasis> n'est finalement pas utilisé (seul un segment avec un
seul document est créé à la fin de l'exécution du script, moment auquel démarre le
processus d'auto-optimisation).
</para>
</sect1>
|