Zend_Search_Lucene-IndexCreation.xml 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!-- EN-Revision: 13910 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.search.lucene.index-creation">
  5. <title>Créer des index</title>
  6. <sect2 id="zend.search.lucene.index-creation.creating">
  7. <title>Créer un nouvel index</title>
  8. <para>La création et la mise à jour des index sont implémentées dans le composant
  9. <classname>Zend_Search_Lucene</classname>, ainsi que dans le projet Java Lucene. Vous pouvez utiliser l'une ou l'autre de
  10. ces options pour créer des index dans lesquels <classname>Zend_Search_Lucene</classname> pourra chercher.</para>
  11. <para>Le listing ci-dessous donne un exemple d'indexation d'un fichier en utilisant l'API d'indexation de
  12. <classname>Zend_Search_Lucene</classname> :</para>
  13. <programlisting role="php"><![CDATA[
  14. // Création de l'index
  15. $index = Zend_Search_Lucene::create('/data/my-index');
  16. $doc = new Zend_Search_Lucene_Document();
  17. // Stockage de l'URL du document afin de pouvoir l'identifier dans les résultats de recherche
  18. $doc->addField(Zend_Search_Lucene_Field::Text('url', $docUrl));
  19. // Indexation des contenus du document
  20. $doc->addField(Zend_Search_Lucene_Field::UnStored('contents', $docContent));
  21. // Ajout du document à l'index
  22. $index->addDocument($doc);
  23. ]]></programlisting>
  24. <para>Les documents nouvellement ajoutés sont immédiatement recherchables dans l'index.</para>
  25. </sect2>
  26. <sect2 id="zend.search.lucene.index-creation.updating">
  27. <title>Mettre à jour un index</title>
  28. <para>La même procédure est utilisée pour mettre à jour un index existant. La seule différence est l'appel de la
  29. méthode open() à la place de <code>create()</code>.</para>
  30. <programlisting role="php"><![CDATA[
  31. // Ouverture d'un index existant
  32. $index = Zend_Search_Lucene::open('/data/my-index');
  33. $doc = new Zend_Search_Lucene_Document();
  34. // Stockage de l'URL du document afin de pouvoir l'identifier dans les résultats de recherche
  35. $doc->addField(Zend_Search_Lucene_Field::Text('url', $docUrl));
  36. // Indexation des contenus du document
  37. $doc->addField(Zend_Search_Lucene_Field::UnStored('contents',
  38. $docContent));
  39. // Ajout du document à l'index
  40. $index->addDocument($doc);
  41. ]]></programlisting>
  42. </sect2>
  43. <sect2 id="zend.search.lucene.index-creation.document-updating">
  44. <title>Mise à jour de Documents</title>
  45. <para>Le format de fichier d'un index Lucene ne permet pas la mise à jour d'un document. Les documents doivent
  46. être supprimés puis réinsérés dans l'index afin d'être mis à jour efficacement.</para>
  47. <para>La méthode <classname>Zend_Search_Lucene::delete()</classname> utilise un identifiant interne de document. Cet
  48. identifiant peut être récupéré dans une requête en demandant la propriété 'id' :</para>
  49. <programlisting role="php"><![CDATA[
  50. $removePath = ...;
  51. $hits = $index->find('path:' . $removePath);
  52. foreach ($hits as $hit) {
  53. $index->delete($hit->id);
  54. }
  55. ]]></programlisting>
  56. </sect2>
  57. <sect2 id="zend.search.lucene.index-creation.counting">
  58. <title>Récupération de la taille de l'index</title>
  59. <para>Il existe deux méthodes pour récupérer la taille d'un index dans <classname>Zend_Search_Lucene</classname>.</para>
  60. <para>La méthode <classname>Zend_Search_Lucene::maxDoc()</classname> retourne un de plus que le plus grand nombre possible
  61. de documents. Il s'agit en fait du nombre total de documents dans l'index, y compris les documents supprimés.
  62. Cette méthode a une méthode synonyme : <classname>Zend_Search_Lucene::count()</classname>.</para>
  63. <para>La méthode <classname>Zend_Search_Lucene::numDocs()</classname> retourne le nombre total de documents non
  64. supprimés.</para>
  65. <programlisting role="php"><![CDATA[
  66. $indexSize = $index->count();
  67. $documents = $index->numDocs();
  68. ]]></programlisting>
  69. <para>La méthode <classname>Zend_Search_Lucene::isDeleted($id)</classname> peut être utilisée pour vérifier si un document
  70. a été supprimé.</para>
  71. <programlisting role="php"><![CDATA[
  72. for ($count = 0; $count < $index->maxDoc(); $count++) {
  73. if ($index->isDeleted($count)) {
  74. echo "Le document #$id a été supprimé.\n";
  75. }
  76. }
  77. ]]></programlisting>
  78. <para>L'optimisation d'index retire les documents supprimés et resserre les identifiants de documents dans un
  79. intervalle plus petit. Ainsi, un identifiant interne de document peut être modifié durant l'optimisation de
  80. l'index.</para>
  81. </sect2>
  82. <sect2 id="zend.search.lucene.index-creation.optimization">
  83. <title>Optimisation d'index</title>
  84. <para>Un index Lucene est composé de plusieurs segments. Chaque segment est un ensemble de données complètement
  85. indépendant des autres.</para>
  86. <para>Les fichiers de segment d'index Lucene ne peuvent pas être mis à jour conceptuellement. Une mise à jour de
  87. segment requiert une réorganisation complète de tous les segments. Consultez les formats de fichiers d'index
  88. pour plus de détails (<ulink
  89. url="http://lucene.apache.org/java/docs/fileformats.html">http://lucene.apache.org/java/docs/fileformats.html</ulink>)
  90. <footnote>
  91. <para>Le format de fichier d'index supporté actuellement est la version 2.3 (depuis Zend Framework
  92. 1.6).</para>
  93. </footnote>Les nouveaux documents sont ajoutés à l'index en créant de nouveaux segments.</para>
  94. <para>L'augmentation du nombre de segments réduit la qualité de l'index, mais l'optimisation de l'index remédie
  95. à ce problème. L'optimisation a pour principale activité de fusionner plusieurs segments en un seul. Ce
  96. processus ne met pas à jour les segments. Il génère un nouveau segment plus gros et met à jour la liste des
  97. segments ('segments' file).</para>
  98. <para>L'optimisation complète de l'index peut être déclenchée en appelant la méthode
  99. <classname>Zend_Search_Lucene::optimize()</classname>. Elle va fusionner tous les segments de l'index en un seul nouveau
  100. segment :</para>
  101. <programlisting role="php"><![CDATA[
  102. // Ouverture d'un index existant.
  103. $index = Zend_Search_Lucene::open('/data/my-index');
  104. // Optimisation de l'index.
  105. $index->optimize();
  106. ]]></programlisting>
  107. <para>L'optimisation automatique de l'index est lancée pour garder les index dans un état cohérent.</para>
  108. <para>L'optimisation automatique est un processus itératif géré par plusieurs options d'index. Il s'agit de
  109. fusionner les très petits segments pour obtenir de plus gros segments, puis de fusionner ces segments obtenus
  110. vers des segments encore plus gros et ainsi de suite.</para>
  111. <sect3 id="zend.search.lucene.index-creation.optimization.maxbuffereddocs">
  112. <title>Option d'optimisation automatique <emphasis>MaxBufferedDocs</emphasis></title>
  113. <para><emphasis>MaxBufferedDocs</emphasis> correspond au nombre minimum de documents requis avant que les
  114. documents présents en mémoire dans le buffer soit écris dans un nouveau segment.</para>
  115. <para><emphasis>MaxBufferedDocs</emphasis> peut être récupéré ou défini en appelant
  116. <code>$index-&gt;getMaxBufferedDocs()</code> ou
  117. <code>$index-&gt;setMaxBufferedDocs($maxBufferedDocs)</code>.</para>
  118. <para>Sa valeur par défaut est 10.</para>
  119. </sect3>
  120. <sect3 id="zend.search.lucene.index-creation.optimization.maxmergedocs">
  121. <title>Option d'optimisation automatique <emphasis>MaxMergeDocs</emphasis></title>
  122. <para><emphasis>MaxMergeDocs</emphasis> correspond à un nombre maximal de documents fusionnés via
  123. <code>addDocument()</code>. Des petites valeurs (p. ex., moins de 10'000) sont préférables pour de
  124. l'indexation interactive, du fait que cela limite les pauses durant l'indexation à quelques secondes. Des
  125. valeurs plus grandes sont meilleures pour les indexations en tâches planifiées (batch) et des recherches
  126. plus rapides.</para>
  127. <para><emphasis>MaxMergeDocs</emphasis> peut être récupéré ou défini en appelant
  128. <code>$index-&gt;getMaxMergeDocs()</code> ou <code>$index-&gt;setMaxMergeDocs($maxMergeDocs)</code>.</para>
  129. <para>Sa valeur par défaut est PHP_INT_MAX.</para>
  130. </sect3>
  131. <sect3 id="zend.search.lucene.index-creation.optimization.mergefactor">
  132. <title>Option d'optimisation automatique <emphasis>MergeFactor</emphasis></title>
  133. <para><emphasis>MergeFactor</emphasis> détermine à quelle fréquence les segments d'index sont fusionnés par
  134. <code>addDocument()</code>. Avec des petites valeurs, on utilise moins de RAM durant l'indexation et les
  135. recherche sur des index non optimisés sont plus rapides, mais la vitesse d'indexation est plus lente. Avec
  136. des valeurs plus grandes, on utilise plus de RAM durant l'indexation, et tandis que les recherches sur les
  137. index non optimisés sont plus lentes, l'indexation est plus rapide. Au final, les grandes valeurs (&gt; 10)
  138. sont préférables pour les indexations planifiées (batch), et les valeurs plus petites (&lt; 10) pour les
  139. index qui sont maintenus de manière interactives.</para>
  140. <para>L'option <emphasis>MergeFactor</emphasis> constitue une bonne estimation pour le nombre moyen de
  141. segments fusionnés par une passe d'auto-optimisation. Des valeurs trop grandes produisent un nombre trop
  142. important de segments car ils ne sont pas fusionnés. Cela peut causer l'erreur "failed to open stream: Too
  143. many open files". Cette limitation est dépendante du système.</para>
  144. <para><emphasis>MergeFactor</emphasis> peut être récupéré ou défini par les méthodes
  145. <code>$index-&gt;getMergeFactor()</code> ou <code>$index-&gt;setMergeFactor($mergeFactor)</code>.</para>
  146. <para>Sa valeur par défaut est 10.</para>
  147. <para>Lucene Java et Luke (Lucene Index Toolbox - <ulink
  148. url="http://www.getopt.org/luke/">http://www.getopt.org/luke/</ulink>) peuvent aussi être utilisés pour
  149. optimiser un index. La dernière version de Luke (v0.8) est basée sur Lucene v2.3 et est compatible avec
  150. l'implémentation courante du composant <classname>Zend_Search_Lucene</classname> (ZF 1.6). Les versions précédentes de
  151. <classname>Zend_Search_Lucene</classname> nécessitent d'autres versions des outils de Java Lucene : <itemizedlist>
  152. <listitem>
  153. <para>ZF 1.5 - Java Lucene 2.1 (Luke tool v0.7.1 - <ulink
  154. url="http://www.getopt.org/luke/luke-0.7.1/"></ulink>)</para>
  155. </listitem>
  156. <listitem>
  157. <para>ZF 1.0 - Java Lucene 1.4 - 2.1 (Luke tool v0.6 - <ulink
  158. url="http://www.getopt.org/luke/luke-0.6/"></ulink>)</para>
  159. </listitem>
  160. </itemizedlist></para>
  161. </sect3>
  162. </sect2>
  163. <sect2 id="zend.search.lucene.index-creation.permissions">
  164. <title>Permissions</title>
  165. <para>Par défaut, les fichiers d'index sont disponibles en lecture et écriture par tout le monde.</para>
  166. <para>Il est possible de surcharger ce comportement grâce à la méthode
  167. <classname>Zend_Search_Lucene_Storage_Directory_Filesystem::setDefaultFilePermissions()</classname> :</para>
  168. <programlisting role="php"><![CDATA[
  169. // Récupération des permissions par défaut
  170. $currentPermissions =
  171. Zend_Search_Lucene_Storage_Directory_Filesystem::getDefaultFilePermissions();
  172. // Donne la permission lecture-écriture uniquement à l'utilisateur et au groupe courant.
  173. Zend_Search_Lucene_Storage_Directory_Filesystem::setDefaultFilePermissions(0660);
  174. ]]></programlisting>
  175. </sect2>
  176. <sect2 id="zend.search.lucene.index-creation.limitations">
  177. <title>Limitations</title>
  178. <sect3 id="zend.search.lucene.index-creation.limitations.index-size">
  179. <title>Taille de l'index</title>
  180. <para>La taille de l'index est limité à 2GB sur les plate-formes 32 bits.</para>
  181. <para>Utilisez des plate-formes 64 bits pour des index plus gros.</para>
  182. </sect3>
  183. <sect3 id="zend.search.lucene.index-creation.limitations.filesystems">
  184. <title>Systèmes de fichiers supportés</title>
  185. <para><classname>Zend_Search_Lucene</classname> utilise <code>flock()</code> pour fournir des recherches concurrentes,
  186. la mise à jour des index et l'optimisation.</para>
  187. <para>Selon la <ulink url="http://www.php.net/manual/en/function.flock.php">documentation</ulink> PHP,
  188. "<code>flock()</code> ne fonctionnera pas sur NFS et plusieurs autres systèmes de fichiers en
  189. réseaux".</para>
  190. <para>N'utilisez pas de systèmes de fichiers en réseaux avec <classname>Zend_Search_Lucene</classname>.</para>
  191. </sect3>
  192. </sect2>
  193. </sect1>
  194. <!--
  195. vim:se ts=4 sw=4 et:
  196. -->