Zend_Search_Lucene-IndexCreation.xml 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 18536 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.search.lucene.index-creation">
  5. <title>Construindo Índices</title>
  6. <sect2 id="zend.search.lucene.index-creation.creating">
  7. <title>Criando um Novo Índice</title>
  8. <para>
  9. As funcionalidades de criação e atualização de índices são implementadas tanto no
  10. componente <classname>Zend_Search_Lucene</classname> como no projeto Java Lucene. Você
  11. pode usar qualquer uma destas opções para criar índices pesquisáveis pelo
  12. <classname>Zend_Search_Lucene</classname>.
  13. </para>
  14. <para>
  15. O código <acronym>PHP</acronym> abaixo mostra um exemplo de como indexar um arquivo
  16. usando a <acronym>API</acronym> de indexação do
  17. <classname>Zend_Search_Lucene</classname>:
  18. </para>
  19. <programlisting language="php"><![CDATA[
  20. // Cria o índice
  21. $index = Zend_Search_Lucene::create('/data/my-index');
  22. $doc = new Zend_Search_Lucene_Document();
  23. // Armazena a URL do documento para identificá-lo nos resultados da pesquisa
  24. $doc->addField(Zend_Search_Lucene_Field::Text('url', $docUrl));
  25. // Indexa os conteúdos do documento
  26. $doc->addField(Zend_Search_Lucene_Field::UnStored('contents', $docContent));
  27. // Adiciona o documento ao índice
  28. $index->addDocument($doc);
  29. ]]></programlisting>
  30. <para>
  31. Documentos adicionados recentemente são imediatamente pesquisáveis no índice.
  32. </para>
  33. </sect2>
  34. <sect2 id="zend.search.lucene.index-creation.updating">
  35. <title>Atualizando um Índice</title>
  36. <para>
  37. O mesmo procedimento é empregado para atualizar um índice existente. A única diferença
  38. é que o método open() é chamado no lugar do método create():
  39. </para>
  40. <programlisting language="php"><![CDATA[
  41. // Abre um índice existente
  42. $index = Zend_Search_Lucene::open('/data/my-index');
  43. $doc = new Zend_Search_Lucene_Document();
  44. // Armazena a URL do documento para identificá-lo no resultado da pesquisa
  45. $doc->addField(Zend_Search_Lucene_Field::Text('url', $docUrl));
  46. // Indexa o conteúdo do documento
  47. $doc->addField(Zend_Search_Lucene_Field::UnStored('contents',
  48. $docContent));
  49. // Adiciona o documento ao índice
  50. $index->addDocument($doc);
  51. ]]></programlisting>
  52. </sect2>
  53. <sect2 id="zend.search.lucene.index-creation.document-updating">
  54. <title>Atualizando os Documentos</title>
  55. <para>
  56. O formato de arquivo do índice Lucene não suporta a atualização do documento. Os
  57. documentos devem ser removidos e adicionados novamente ao índice para atualizá-los de
  58. forma eficaz.
  59. </para>
  60. <para>
  61. O método <methodname>Zend_Search_Lucene::delete()</methodname> funciona com uma
  62. identificação interna do índice do documento. Ela pode ser recuperada de uma consulta
  63. pela propriedade '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>Recuperando o Tamanho do Índice</title>
  75. <para>
  76. Existem dois métodos para recuperar o tamanho de um índice no
  77. <classname>Zend_Search_Lucene</classname>.
  78. </para>
  79. <para>
  80. O método <methodname>Zend_Search_Lucene::maxDoc()</methodname> retorna um número maior
  81. do que o maior número possível de documentos. É na verdade o número total de documentos
  82. no índice incluindo os documentos excluídos, por isso ele tem um sinônimo:
  83. <methodname>Zend_Search_Lucene::count()</methodname>.
  84. </para>
  85. <para>
  86. O método <methodname>Zend_Search_Lucene::numDocs()</methodname> retorna o número total
  87. de documentos que não foram excluídos.
  88. </para>
  89. <programlisting language="php"><![CDATA[
  90. $indexSize = $index->count();
  91. $documents = $index->numDocs();
  92. ]]></programlisting>
  93. <para>
  94. O método <methodname>Zend_Search_Lucene::isDeleted($id)</methodname> pode ser usado para
  95. verificar se um documento foi excluído.
  96. </para>
  97. <programlisting language="php"><![CDATA[
  98. for ($count = 0; $count < $index->maxDoc(); $count++) {
  99. if ($index->isDeleted($count)) {
  100. echo "O documento #$id foi excluído.\n";
  101. }
  102. }
  103. ]]></programlisting>
  104. <para>
  105. A otimização do índice remove os documentos excluídos e comprime as IDs dos documentos
  106. em um intervalo menor. Assim, uma id interna de um documento pode ser alterada durante
  107. a otimização do índice.
  108. </para>
  109. </sect2>
  110. <sect2 id="zend.search.lucene.index-creation.optimization">
  111. <title>Otimização do Índice</title>
  112. <para>
  113. Um índice Lucene é composto por vários segmentos. Cada segmento é um conjunto de dados
  114. completamente independente.
  115. </para>
  116. <para>
  117. Os arquivos de segmento de índice Lucene não podem ser atualizados devido ao seu
  118. projeto. A atualização de um segmento necessita de uma reorganização completa do
  119. segmento. Veja os formatos de arquivos de índice Lucene para mais detalhes
  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. O formato de arquivo de índice Lucene atualmente suportado é a versão 2.3
  125. (desde Zend Framework 1.6).
  126. </para>
  127. </footnote>.
  128. Novos documentos são adicionados ao índice através da criação de um novo segmento.
  129. </para>
  130. <para>
  131. Increasing number of segments reduces quality of the index, but index optimization restores it.
  132. Optimization essentially merges several segments into a new one. This process also doesn't update segments.
  133. It generates one new large segment and updates segment list ('segments' file).
  134. </para>
  135. <para>
  136. Full index optimization can be trigger by calling the <methodname>Zend_Search_Lucene::optimize()</methodname> method. It merges all
  137. index segments into one new segment:
  138. </para>
  139. <programlisting language="php"><![CDATA[
  140. // Open existing index
  141. $index = Zend_Search_Lucene::open('/data/my-index');
  142. // Optimize index.
  143. $index->optimize();
  144. ]]></programlisting>
  145. <para>
  146. Automatic index optimization is performed to keep indexes in a consistent state.
  147. </para>
  148. <para>
  149. Automatic optimization is an iterative process managed by several index options. It merges very small segments
  150. into larger ones, then merges these larger segments into even larger segments and so on.
  151. </para>
  152. <sect3 id="zend.search.lucene.index-creation.optimization.maxbuffereddocs">
  153. <title>MaxBufferedDocs auto-optimization option</title>
  154. <para>
  155. <emphasis>MaxBufferedDocs</emphasis> is a minimal number of documents required before
  156. the buffered in-memory documents are written into a new segment.
  157. </para>
  158. <para>
  159. <emphasis>MaxBufferedDocs</emphasis> can be retrieved or set by <code>$index->getMaxBufferedDocs()</code> or
  160. <code>$index->setMaxBufferedDocs($maxBufferedDocs)</code> calls.
  161. </para>
  162. <para>
  163. Default value is 10.
  164. </para>
  165. </sect3>
  166. <sect3 id="zend.search.lucene.index-creation.optimization.maxmergedocs">
  167. <title>MaxMergeDocs auto-optimization option</title>
  168. <para>
  169. <emphasis>MaxMergeDocs</emphasis> is a largest number of documents ever merged by addDocument().
  170. Small values (e.g., less than 10.000) are best for interactive indexing, as this limits the length
  171. of pauses while indexing to a few seconds. Larger values are best for batched indexing and speedier
  172. searches.
  173. </para>
  174. <para>
  175. <emphasis>MaxMergeDocs</emphasis> can be retrieved or set by <code>$index->getMaxMergeDocs()</code> or
  176. <code>$index->setMaxMergeDocs($maxMergeDocs)</code> calls.
  177. </para>
  178. <para>
  179. Default value is PHP_INT_MAX.
  180. </para>
  181. </sect3>
  182. <sect3 id="zend.search.lucene.index-creation.optimization.mergefactor">
  183. <title>MergeFactor auto-optimization option</title>
  184. <para>
  185. <emphasis>MergeFactor</emphasis> determines how often segment indices are merged by addDocument().
  186. With smaller values, less <acronym>RAM</acronym> is used while indexing, and searches on unoptimized indices are faster,
  187. but indexing speed is slower. With larger values, more <acronym>RAM</acronym> is used during indexing, and while searches
  188. on unoptimized indices are slower, indexing is faster. Thus larger values (&gt; 10) are best for batch
  189. index creation, and smaller values (&lt; 10) for indices that are interactively maintained.
  190. </para>
  191. <para>
  192. <emphasis>MergeFactor</emphasis> is a good estimation for average number of segments merged by one auto-optimization pass.
  193. Too large values produce large number of segments while they are not merged into new one. It may be a cause of
  194. "failed to open stream: Too many open files" error message. This limitation is system dependent.
  195. </para>
  196. <para>
  197. <emphasis>MergeFactor</emphasis> can be retrieved or set by <code>$index->getMergeFactor()</code> or
  198. <code>$index->setMergeFactor($mergeFactor)</code> calls.
  199. </para>
  200. <para>
  201. Default value is 10.
  202. </para>
  203. <para>
  204. Lucene Java and Luke (Lucene Index Toolbox - <ulink url="http://www.getopt.org/luke/">http://www.getopt.org/luke/</ulink>)
  205. can also be used to optimize an index. Latest Luke release (v0.8) is based on Lucene v2.3 and compatible with
  206. current implementation of <classname>Zend_Search_Lucene</classname> component (Zend Framework 1.6). Earlier versions of <classname>Zend_Search_Lucene</classname> implementations
  207. need another versions of Java Lucene tools to be compatible:
  208. <itemizedlist>
  209. <listitem>
  210. <para>Zend Framework 1.5 - Java Lucene 2.1 (Luke tool v0.7.1 - <ulink url="http://www.getopt.org/luke/luke-0.7.1/"/>)</para>
  211. </listitem>
  212. <listitem>
  213. <para>Zend Framework 1.0 - Java Lucene 1.4 - 2.1 (Luke tool v0.6 - <ulink url="http://www.getopt.org/luke/luke-0.6/"/>)</para>
  214. </listitem>
  215. </itemizedlist>
  216. </para>
  217. </sect3>
  218. </sect2>
  219. <sect2 id="zend.search.lucene.index-creation.permissions">
  220. <title>Permissions</title>
  221. <para>
  222. By default, index files are available for reading and writing by everyone.
  223. </para>
  224. <para>
  225. It's possible to override this with the <methodname>Zend_Search_Lucene_Storage_Directory_Filesystem::setDefaultFilePermissions()</methodname> method:
  226. </para>
  227. <programlisting language="php"><![CDATA[
  228. // Get current default file permissions
  229. $currentPermissions =
  230. Zend_Search_Lucene_Storage_Directory_Filesystem::getDefaultFilePermissions();
  231. // Give read-writing permissions only for current user and group
  232. Zend_Search_Lucene_Storage_Directory_Filesystem::setDefaultFilePermissions(0660);
  233. ]]></programlisting>
  234. </sect2>
  235. <sect2 id="zend.search.lucene.index-creation.limitations">
  236. <title>Limitations</title>
  237. <sect3 id="zend.search.lucene.index-creation.limitations.index-size">
  238. <title>Index size</title>
  239. <para>
  240. Index size is limited by 2GB for 32-bit platforms.
  241. </para>
  242. <para>
  243. Use 64-bit platforms for larger indices.
  244. </para>
  245. </sect3>
  246. <sect3 id="zend.search.lucene.index-creation.limitations.filesystems">
  247. <title>Supported Filesystems</title>
  248. <para>
  249. <classname>Zend_Search_Lucene</classname> uses <methodname>flock()</methodname> to provide concurrent searching, index updating and optimization.
  250. </para>
  251. <para>
  252. According to the <acronym>PHP</acronym> <ulink url="http://www.php.net/manual/en/function.flock.php">documentation</ulink>,
  253. "<methodname>flock()</methodname> will not work on NFS and many other networked file systems".
  254. </para>
  255. <para>
  256. Do not use networked file systems with <classname>Zend_Search_Lucene</classname>.
  257. </para>
  258. </sect3>
  259. </sect2>
  260. </sect1>
  261. <!--
  262. vim:se ts=4 sw=4 et:
  263. -->