Zend_Search_Lucene-IndexCreation.xml 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 20854 -->
  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 (<ulink
  120. url="http://lucene.apache.org/java/2_3_0/fileformats.html">http://lucene.apache.org/java/2_3_0/fileformats.html</ulink>)
  121. <footnote>
  122. <para>
  123. O formato de arquivo de índice Lucene atualmente suportado é a versão 2.3
  124. (desde Zend Framework 1.6).
  125. </para>
  126. </footnote>.
  127. Novos documentos são adicionados ao índice através da criação de um novo segmento.
  128. </para>
  129. <para>
  130. O aumento do número de segmentos reduz a qualidade do índice, mas uma otimização do
  131. índice resolverá o problema. Essencialmente, a otimização mescla vários segmentos em um
  132. novo. Além disso, este processo não atualiza os segmentos. Ele gera um novo grande
  133. segmento e atualiza a lista de segmentos (arquivo 'segments').
  134. </para>
  135. <para>
  136. A otimização completa do índice pode ser feita chamando o método
  137. <methodname>Zend_Search_Lucene::optimize()</methodname>. Ele funde todos os segmentos de
  138. índice em um novo segmento:
  139. </para>
  140. <programlisting language="php"><![CDATA[
  141. // Abre um índice existente
  142. $index = Zend_Search_Lucene::open('/data/my-index');
  143. // Otimiza o índice
  144. $index->optimize();
  145. ]]></programlisting>
  146. <para>
  147. A otimização automática do índice é realizada para manter os índices em um estado
  148. consistente.
  149. </para>
  150. <para>
  151. A otimização automática é um processo iterativo controlado por várias opções de índice.
  152. Ele funde segmentos muito pequenos para obter outros maiores, então mescla esses
  153. segmentos em segmentos ainda maiores e assim por diante.
  154. </para>
  155. <sect3 id="zend.search.lucene.index-creation.optimization.maxbuffereddocs">
  156. <title>MaxBufferedDocs auto-optimization option</title>
  157. <para>
  158. <emphasis>MaxBufferedDocs</emphasis> is a minimal number of documents required
  159. before the buffered in-memory documents are written into a new segment.
  160. </para>
  161. <para>
  162. <emphasis>MaxBufferedDocs</emphasis> can be retrieved or set by
  163. <code>$index->getMaxBufferedDocs()</code> or
  164. <code>$index->setMaxBufferedDocs($maxBufferedDocs)</code> calls.
  165. </para>
  166. <para>
  167. Default value is 10.
  168. </para>
  169. </sect3>
  170. <sect3 id="zend.search.lucene.index-creation.optimization.maxmergedocs">
  171. <title>MaxMergeDocs auto-optimization option</title>
  172. <para>
  173. <emphasis>MaxMergeDocs</emphasis> is a largest number of documents ever merged by
  174. addDocument(). Small values (e.g., less than 10.000) are best for interactive
  175. indexing, as this limits the length of pauses while indexing to a few seconds.
  176. Larger values are best for batched indexing and speedier searches.
  177. </para>
  178. <para>
  179. <emphasis>MaxMergeDocs</emphasis> can be retrieved or set by
  180. <code>$index->getMaxMergeDocs()</code> or
  181. <code>$index->setMaxMergeDocs($maxMergeDocs)</code> calls.
  182. </para>
  183. <para>
  184. Default value is PHP_INT_MAX.
  185. </para>
  186. </sect3>
  187. <sect3 id="zend.search.lucene.index-creation.optimization.mergefactor">
  188. <title>MergeFactor auto-optimization option</title>
  189. <para>
  190. <emphasis>MergeFactor</emphasis> determines how often segment indices are merged by
  191. addDocument(). With smaller values, less <acronym>RAM</acronym> is used while
  192. indexing, and searches on unoptimized indices are faster, but indexing speed is
  193. slower. With larger values, more <acronym>RAM</acronym> is used during indexing, and
  194. while searches on unoptimized indices are slower, indexing is faster. Thus larger
  195. values (&gt; 10) are best for batch index creation, and smaller values (&lt; 10) for
  196. indices that are interactively maintained.
  197. </para>
  198. <para>
  199. <emphasis>MergeFactor</emphasis> is a good estimation for average number of segments
  200. merged by one auto-optimization pass. Too large values produce large number of
  201. segments while they are not merged into new one. It may be a cause of "failed to
  202. open stream: Too many open files" error message. This limitation is system
  203. dependent.
  204. </para>
  205. <para>
  206. <emphasis>MergeFactor</emphasis> can be retrieved or set by
  207. <code>$index->getMergeFactor()</code> or
  208. <code>$index->setMergeFactor($mergeFactor)</code> calls.
  209. </para>
  210. <para>
  211. Default value is 10.
  212. </para>
  213. <para>
  214. Lucene Java and Luke (Lucene Index Toolbox - <ulink
  215. url="http://www.getopt.org/luke/">http://www.getopt.org/luke/</ulink>) can also
  216. be used to optimize an index. Latest Luke release (v0.8) is based on Lucene v2.3 and
  217. compatible with current implementation of <classname>Zend_Search_Lucene</classname>
  218. component (Zend Framework 1.6). Earlier versions of
  219. <classname>Zend_Search_Lucene</classname> implementations need another versions of
  220. Java Lucene tools to be compatible:
  221. <itemizedlist>
  222. <listitem>
  223. <para>
  224. Zend Framework 1.5 - Java Lucene 2.1 (Luke tool v0.7.1 - <ulink
  225. url="http://www.getopt.org/luke/luke-0.7.1/"/>)
  226. </para>
  227. </listitem>
  228. <listitem>
  229. <para>
  230. Zend Framework 1.0 - Java Lucene 1.4 - 2.1 (Luke tool v0.6 - <ulink
  231. url="http://www.getopt.org/luke/luke-0.6/"/>)
  232. </para>
  233. </listitem>
  234. </itemizedlist>
  235. </para>
  236. </sect3>
  237. </sect2>
  238. <sect2 id="zend.search.lucene.index-creation.permissions">
  239. <title>Permissions</title>
  240. <para>
  241. By default, index files are available for reading and writing by everyone.
  242. </para>
  243. <para>
  244. It's possible to override this with the
  245. <methodname>Zend_Search_Lucene_Storage_Directory_Filesystem::setDefaultFilePermissions()</methodname>
  246. method:
  247. </para>
  248. <programlisting language="php"><![CDATA[
  249. // Get current default file permissions
  250. $currentPermissions =
  251. Zend_Search_Lucene_Storage_Directory_Filesystem::getDefaultFilePermissions();
  252. // Give read-writing permissions only for current user and group
  253. Zend_Search_Lucene_Storage_Directory_Filesystem::setDefaultFilePermissions(0660);
  254. ]]></programlisting>
  255. </sect2>
  256. <sect2 id="zend.search.lucene.index-creation.limitations">
  257. <title>Limitations</title>
  258. <sect3 id="zend.search.lucene.index-creation.limitations.index-size">
  259. <title>Index size</title>
  260. <para>
  261. Index size is limited by 2GB for 32-bit platforms.
  262. </para>
  263. <para>
  264. Use 64-bit platforms for larger indices.
  265. </para>
  266. </sect3>
  267. <sect3 id="zend.search.lucene.index-creation.limitations.filesystems">
  268. <title>Supported Filesystems</title>
  269. <para>
  270. <classname>Zend_Search_Lucene</classname> uses <methodname>flock()</methodname> to
  271. provide concurrent searching, index updating and optimization.
  272. </para>
  273. <para>
  274. According to the <acronym>PHP</acronym> <ulink
  275. url="http://www.php.net/manual/en/function.flock.php">documentation</ulink>,
  276. "<methodname>flock()</methodname> will not work on NFS and many other networked file
  277. systems".
  278. </para>
  279. <para>
  280. Do not use networked file systems with <classname>Zend_Search_Lucene</classname>.
  281. </para>
  282. </sect3>
  283. </sect2>
  284. </sect1>
  285. <!--
  286. vim:se ts=4 sw=4 et:
  287. -->