Zend_Search_Lucene-Charset.xml 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.search.lucene.charset">
  5. <title>Conjunto de Caracteres</title>
  6. <sect2 id="zend.search.lucene.charset.description">
  7. <title>Suporte aos conjuntos de caracteres UTF-8 e single-byte</title>
  8. <para>
  9. <classname>Zend_Search_Lucene</classname> trabalha internamente com o conjunto de
  10. caracteres UTF-8. Arquivos de índice armazenam dados unicode no formato de codificação
  11. "UTF-8 modificado" usado pelo Java. O núcleo do
  12. <classname>Zend_Search_Lucene</classname> suporta esta codificação plenamente, com uma
  13. exceção.
  14. <footnote>
  15. <para>
  16. <classname>Zend_Search_Lucene</classname> suporta somente os caracteres do Plano
  17. Multilingual Básico (BMP) (de 0x0000 a 0xFFFF), não suportando os caracteres
  18. suplementares (caracteres acima de 0xFFFF)
  19. </para>
  20. <para>
  21. O Java 2 representa estes caracteres como um par de valores do tipo char
  22. (16 bits), o primeiro vem da faixa superior (0xD800-0xDBFF), o segundo, da faixa
  23. inferior (0xDC00-0xDFFF). Logo eles são codificados como caracteres usuais UTF-8
  24. em seis bytes. A representação padrão UTF-8 utiliza quatro bytes para caracteres
  25. suplementares.
  26. </para>
  27. </footnote>
  28. </para>
  29. <para>
  30. A codificação dos dados de entrada pode ser especificada através da
  31. <acronym>API</acronym> de <classname>Zend_Search_Lucene</classname>. Os dados serão
  32. convertidos automaticamente na codificação UTF-8.
  33. </para>
  34. </sect2>
  35. <sect2 id="zend.search.lucene.charset.default_analyzer">
  36. <title>Analisador de texto padrão</title>
  37. <para>
  38. De qualquer modo, o analisador de texto padrão (que também é usado no analisador de
  39. consultas) utiliza ctype_alpha() para a separação de texto e consultas em tokens.
  40. </para>
  41. <para>
  42. ctype_alpha() não é compatível com UTF-8, por isso o analisador converte o texto para a
  43. codificação 'ASCII//TRANSLIT' antes da indexação. O mesmo processo é realizado
  44. transparentemente durante a análise da consulta.
  45. <footnote>
  46. <para>
  47. A conversão para 'ASCII//TRANSLIT' depende da localidade atual e do SO.
  48. </para>
  49. </footnote>
  50. </para>
  51. <note>
  52. <title/>
  53. <para>
  54. O analisador padrão não trata os números como parte de termos. Utilize o analisador
  55. 'Num' correspondente se você não quer que palavras sejam quebradas por números.
  56. </para>
  57. </note>
  58. </sect2>
  59. <sect2 id="zend.search.lucene.charset.utf_analyzer">
  60. <title>Analisadores de texto compatíveis com UTF-8</title>
  61. <para>
  62. <classname>Zend_Search_Lucene</classname> também contém um conjunto de analisadores
  63. compatíveis com UTF-8:
  64. <classname>Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8</classname>,
  65. <classname>Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8Num</classname>,
  66. <classname>Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8_CaseInsensitive</classname>,
  67. <classname>Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8Num_CaseInsensitive</classname>.
  68. </para>
  69. <para>
  70. Qualquer um desses analisadores pode ser ativado como o código a seguir:
  71. </para>
  72. <programlisting language="php"><![CDATA[
  73. Zend_Search_Lucene_Analysis_Analyzer::setDefault(
  74. new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8());
  75. ]]></programlisting>
  76. <warning>
  77. <title/>
  78. <para>
  79. Os analisadores compatíveis com UTF-8 foram melhorados no Zend Framework 1.5. As
  80. primeiras versões dos analisadores assumiam como sendo letras todos os caracteres
  81. que não fossem ASCII. A implementação dos novos analisadores possui um comportamento
  82. mais correto.
  83. </para>
  84. <para>
  85. Isso pode exigir que você reconstrua o índice para ter os dados e as consultas de
  86. pesquisas separados em tokens do mesmo formato, caso contrário o motor de busca pode
  87. retornar conjuntos de resultados errados.
  88. </para>
  89. </warning>
  90. <para>
  91. Todos estes analisadores necessitam da biblioteca PCRE (Perl-compatible regular
  92. expressions) compilada com suporte à UTF-8 ativado. O suporte à UTF-8 do PCRE está
  93. ativado nas fontes da biblioteca PCRE fornecidas com o código fonte do
  94. <acronym>PHP</acronym>, mas se uma biblioteca compartilhada é usada em vez do pacote com
  95. as fontes do <acronym>PHP</acronym>, então o estado do suporte à UTF-8 vai depender de
  96. seu sistema operacional.
  97. </para>
  98. <para>
  99. Use o seguinte código para verificar, se o PCRE com suporte à UTF-8 está habilitado:
  100. </para>
  101. <programlisting language="php"><![CDATA[
  102. if (@preg_match('/\pL/u', 'a') == 1) {
  103. echo "PCRE com suporte a Unicode está ativado.\n";
  104. } else {
  105. echo "PCRE com suporte a Unicode está desativado.\n";
  106. }
  107. ]]></programlisting>
  108. <para>
  109. Versões dos analisadores compatíveis com UTF-8 insensíveis a maiúsculas e minúsculas
  110. precisam também da extensão <ulink
  111. url="http://www.php.net/manual/en/ref.mbstring.php">mbstring</ulink> habilitada.
  112. </para>
  113. <para>
  114. Se você não quer ativar a extensão mbstring, mas precisa de buscas sem diferenciação de
  115. maiúsculas e minúsculas, pode-se usar a seguinte abordagem: normalizar os dados antes da
  116. indexação e a string de consulta antes de pesquisar, convertendo-os em minúsculas:
  117. </para>
  118. <programlisting language="php"><![CDATA[
  119. // Indexando
  120. setlocale(LC_CTYPE, 'de_DE.iso-8859-1');
  121. ...
  122. Zend_Search_Lucene_Analysis_Analyzer::setDefault(
  123. new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8());
  124. ...
  125. $doc = new Zend_Search_Lucene_Document();
  126. $doc->addField(Zend_Search_Lucene_Field::UnStored('contents',
  127. strtolower($contents)));
  128. // Título de campo para pesquisa direta (indexado, não armazenado)
  129. $doc->addField(Zend_Search_Lucene_Field::UnStored('title',
  130. strtolower($title)));
  131. // Título de campo para recuperação (não indexado, armazenado)
  132. $doc->addField(Zend_Search_Lucene_Field::UnIndexed('_title', $title));
  133. ]]></programlisting>
  134. <programlisting language="php"><![CDATA[
  135. // Buscando
  136. setlocale(LC_CTYPE, 'de_DE.iso-8859-1');
  137. ...
  138. Zend_Search_Lucene_Analysis_Analyzer::setDefault(
  139. new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8());
  140. ...
  141. $hits = $index->find(strtolower($query));
  142. ]]></programlisting>
  143. </sect2>
  144. </sect1>