Zend_Search_Lucene-IndexCreation.xml 15 KB

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