Zend_Search_Lucene-IndexCreation.xml 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357
  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>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>Opção de auto-otimização MaxBufferedDocs</title>
  157. <para>
  158. <emphasis>MaxBufferedDocs</emphasis> é o número mínimo de documentos necessários
  159. antes que os documentos presentes na memória dentro do buffer sejam escritos em um
  160. novo segmento.
  161. </para>
  162. <para>
  163. <emphasis>MaxBufferedDocs</emphasis> pode ser recuperado ou definido pelas chamadas
  164. <code>$index->getMaxBufferedDocs()</code> ou
  165. <code>$index->setMaxBufferedDocs($maxBufferedDocs)</code>.
  166. </para>
  167. <para>
  168. O valor padrão é 10.
  169. </para>
  170. </sect3>
  171. <sect3 id="zend.search.lucene.index-creation.optimization.maxmergedocs">
  172. <title>Opção de auto-otimização MaxMergeDocs</title>
  173. <para>
  174. <emphasis>MaxMergeDocs</emphasis> é o maior número de documentos já fundidos por
  175. addDocument(). Valores pequenos (p. ex., menores que 10.000) são os melhores para
  176. indexação interativa, visto que isso limita em alguns segundos a duração das pausas
  177. durante a indexação. Os maiores valores são os melhores para a indexação em lote e
  178. buscas rápidas.
  179. </para>
  180. <para>
  181. <emphasis>MaxMergeDocs</emphasis> pode ser recuperado ou definido pelas chamadas
  182. <code>$index->getMaxMergeDocs()</code> ou
  183. <code>$index->setMaxMergeDocs($maxMergeDocs)</code>.
  184. </para>
  185. <para>
  186. O valor padrão é PHP_INT_MAX.
  187. </para>
  188. </sect3>
  189. <sect3 id="zend.search.lucene.index-creation.optimization.mergefactor">
  190. <title>Opção de auto-otimização MergeFactor</title>
  191. <para>
  192. <emphasis>MergeFactor</emphasis> determina a frequência com que os índices de
  193. segmento são fundidos por addDocument(). Com valores menores, menos memória
  194. <acronym>RAM</acronym> é usada durante a indexação, e buscas em índices não
  195. otimizados são mais rápidas, mas a velocidade de indexação é mais lenta. Com valores
  196. maiores, mais memória <acronym>RAM</acronym> é usada durante a indexação, e, embora
  197. as buscas em índices não otimizados sejam mais lentas, a indexação é mais rápida.
  198. Desse modo, valores maiores (&gt; 10) são melhores para a criação de índices em
  199. lotes, e os valores menores (&lt; 10) são melhores para os índices que são mantidos
  200. de forma interativa.
  201. </para>
  202. <para>
  203. <emphasis>MergeFactor</emphasis> é uma boa estimativa para o número médio de
  204. segmentos fundidos em uma passagem de auto-otimização. Valores muito grandes
  205. produzem um grande número de segmentos, enquanto não são fundidos em um novo. Isso
  206. pode causar a mensagem de erro "failed to open stream: Too many open files". Essa
  207. limitação é dependente do sistema.
  208. </para>
  209. <para>
  210. <emphasis>MergeFactor</emphasis> pode ser recuperado ou definido pelas chamadas
  211. <code>$index->getMergeFactor()</code> ou
  212. <code>$index->setMergeFactor($mergeFactor)</code>.
  213. </para>
  214. <para>
  215. O valor padrão é 10.
  216. </para>
  217. <para>
  218. Lucene Java e Luke (Lucene Index Toolbox - <ulink
  219. url="http://www.getopt.org/luke/">http://www.getopt.org/luke/</ulink>) também
  220. podem ser usados para otimizar um índice. O último lançamento do Luke (v0.8) é
  221. baseado no Lucene v2.3 e é compatível com a atual implementação do componente
  222. <classname>Zend_Search_Lucene</classname> (Zend Framework 1.6). Versões anteriores
  223. das implementações do <classname>Zend_Search_Lucene</classname> necessitam de outras
  224. versões das ferramentas Java Lucene para serem compatíveis:
  225. <itemizedlist>
  226. <listitem>
  227. <para>
  228. Zend Framework 1.5 - Java Lucene 2.1 (Luke tool v0.7.1 - <ulink
  229. url="http://www.getopt.org/luke/luke-0.7.1/"/>)
  230. </para>
  231. </listitem>
  232. <listitem>
  233. <para>
  234. Zend Framework 1.0 - Java Lucene 1.4 - 2.1 (Luke tool v0.6 - <ulink
  235. url="http://www.getopt.org/luke/luke-0.6/"/>)
  236. </para>
  237. </listitem>
  238. </itemizedlist>
  239. </para>
  240. </sect3>
  241. </sect2>
  242. <sect2 id="zend.search.lucene.index-creation.permissions">
  243. <title>Permissões</title>
  244. <para>
  245. Por padrão, arquivos de índice estão disponíveis para leitura e escrita por todos.
  246. </para>
  247. <para>
  248. É possível substituir esse comportamento com o método
  249. <methodname>Zend_Search_Lucene_Storage_Directory_Filesystem::setDefaultFilePermissions()</methodname>:
  250. </para>
  251. <programlisting language="php"><![CDATA[
  252. // Recupera as permissões padrões
  253. $currentPermissions =
  254. Zend_Search_Lucene_Storage_Directory_Filesystem::getDefaultFilePermissions();
  255. // Fornece permissões de leitura e escrita apenas para o usuário e grupo atuais
  256. Zend_Search_Lucene_Storage_Directory_Filesystem::setDefaultFilePermissions(0660);
  257. ]]></programlisting>
  258. </sect2>
  259. <sect2 id="zend.search.lucene.index-creation.limitations">
  260. <title>Limitações</title>
  261. <sect3 id="zend.search.lucene.index-creation.limitations.index-size">
  262. <title>Tamanho do Índice</title>
  263. <para>
  264. O tamanho do índice é limitado em 2GB para plataformas 32-bit.
  265. </para>
  266. <para>
  267. Utilize plataformas 64-bit para índices maiores.
  268. </para>
  269. </sect3>
  270. <sect3 id="zend.search.lucene.index-creation.limitations.filesystems">
  271. <title>Sistemas de Arquivos Suportados</title>
  272. <para>
  273. <classname>Zend_Search_Lucene</classname> utiliza <methodname>flock()</methodname>
  274. para fornecer pesquisas simultâneas, atualização de índice e otimização.
  275. </para>
  276. <para>
  277. De acordo com a <ulink
  278. url="http://www.php.net/manual/en/function.flock.php">documentação</ulink> do
  279. <acronym>PHP</acronym>, "<methodname>flock()</methodname> não funcionará em NFS ou
  280. em qualquer outro sistema de arquivos em rede.".
  281. </para>
  282. <para>
  283. Não utilize sistemas de arquivos em rede com o
  284. <classname>Zend_Search_Lucene</classname>.
  285. </para>
  286. </sect3>
  287. </sect2>
  288. </sect1>
  289. <!--
  290. vim:se ts=4 sw=4 et:
  291. -->