Zend_Search_Lucene-Charset.xml 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 20854 -->
  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. consulta) utiliza ctype_alpha() para a sinalização de texto e consultas.
  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. <para>
  53. O analisador padrão não trata os números como parte de termos. Utilize o analisador
  54. 'Num' correspondente se você não quer que palavras sejam quebradas por números.
  55. </para>
  56. </note>
  57. </sect2>
  58. <sect2 id="zend.search.lucene.charset.utf_analyzer">
  59. <title>Analisadores de texto compatíveis com UTF-8</title>
  60. <para>
  61. <classname>Zend_Search_Lucene</classname> também contém um conjunto de analisadores
  62. compatíveis com UTF-8:
  63. <classname>Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8</classname>,
  64. <classname>Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8Num</classname>,
  65. <classname>Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8_CaseInsensitive</classname>,
  66. <classname>Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8Num_CaseInsensitive</classname>.
  67. </para>
  68. <para>
  69. Qualquer um desses analisadores pode ser ativado como o código a seguir:
  70. <programlisting language="php"><![CDATA[
  71. Zend_Search_Lucene_Analysis_Analyzer::setDefault(
  72. new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8());
  73. ]]></programlisting>
  74. </para>
  75. <warning>
  76. <para>
  77. Os analisadores compatíveis com UTF-8 foram melhorados no Zend Framework 1.5. As
  78. primeiras versões dos analisadores assumiam como sendo letras todos os caracteres
  79. que não fossem ASCII. A implementação dos novos analisadores possui um comportamento
  80. mais correto.
  81. </para>
  82. <para>
  83. Isso pode exigir que você reconstrua o índice para ter os dados e as consultas de
  84. pesquisa no mesmo formato, caso contrário o motor de busca pode retornar conjuntos
  85. de resultados errados.
  86. </para>
  87. </warning>
  88. <para>
  89. Todos estes analisadores necessitam da biblioteca PCRE (Perl-compatible regular
  90. expressions) compilada com suporte à UTF-8 ativado. O suporte à UTF-8 do PCRE está
  91. ativado nas fontes da biblioteca PCRE fornecidas com o código fonte do
  92. <acronym>PHP</acronym>, mas se uma biblioteca compartilhada é usada em vez do pacote com
  93. as fontes do <acronym>PHP</acronym>, então o estado do suporte à UTF-8 vai depender de
  94. seu sistema operacional.
  95. </para>
  96. <para>
  97. Use o seguinte código para verificar, se o PCRE com suporte à UTF-8 está habilitado:
  98. <programlisting language="php"><![CDATA[
  99. if (@preg_match('/\pL/u', 'a') == 1) {
  100. echo "PCRE com suporte a Unicode está ativado.\n";
  101. } else {
  102. echo "PCRE com suporte a Unicode está desativado.\n";
  103. }
  104. ]]></programlisting>
  105. </para>
  106. <para>
  107. Versões dos analisadores compatíveis com UTF-8 insensíveis a maiúsculas e minúsculas
  108. precisam também da extensão <ulink
  109. url="http://www.php.net/manual/en/ref.mbstring.php">mbstring</ulink> habilitada.
  110. </para>
  111. <para>
  112. Se você não quer ativar a extensão mbstring, mas precisa de buscas sem diferenciação de
  113. maiúsculas e minúsculas, pode-se usar a seguinte abordagem: normalizar os dados antes da
  114. indexação e a string de consulta antes de pesquisar, convertendo-os em minúsculas:
  115. <programlisting language="php"><![CDATA[
  116. // Indexando
  117. setlocale(LC_CTYPE, 'de_DE.iso-8859-1');
  118. ...
  119. Zend_Search_Lucene_Analysis_Analyzer::setDefault(
  120. new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8());
  121. ...
  122. $doc = new Zend_Search_Lucene_Document();
  123. $doc->addField(Zend_Search_Lucene_Field::UnStored('contents',
  124. strtolower($contents)));
  125. // Título de campo para pesquisa direta (indexado, não armazenado)
  126. $doc->addField(Zend_Search_Lucene_Field::UnStored('title',
  127. strtolower($title)));
  128. // Título de campo para recuperação (não indexado, armazenado)
  129. $doc->addField(Zend_Search_Lucene_Field::UnIndexed('_title', $title));
  130. ]]></programlisting>
  131. <programlisting language="php"><![CDATA[
  132. // Buscando
  133. setlocale(LC_CTYPE, 'de_DE.iso-8859-1');
  134. ...
  135. Zend_Search_Lucene_Analysis_Analyzer::setDefault(
  136. new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8());
  137. ...
  138. $hits = $index->find(strtolower($query));
  139. ]]></programlisting>
  140. </para>
  141. </sect2>
  142. </sect1>