Zend_Search_Lucene-Charset.xml 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.search.lucene.charset">
  5. <title>Jeu de caractères</title>
  6. <sect2 id="zend.search.lucene.charset.description">
  7. <title>Support UTF-8 et caractères sur un octet</title>
  8. <para>
  9. <classname>Zend_Search_Lucene</classname> utilise l'UTF-8 en interne. Les fichiers
  10. d'index stockent des données Unicode dans le "format UTF-8 modifié" de Java.
  11. <classname>Zend_Search_Lucene</classname> supporte totalement ce format, à une exception
  12. près. <footnote>
  13. <para>
  14. Zend_Search_Lucene supporte seulement les caractères Basic Multilingual
  15. Plane (BMP) (de 0x0000 à 0xFFFF) et ne supporte pas les "caractères
  16. supplémentaires" (caractères dont les codes sont supérieurs à 0xFFFF).
  17. </para>
  18. <para>
  19. Java 2 représente ces caractères comme une paire de char (16-bit), le
  20. premier depuis l'échelle haute (0xD800-0xDBFF), le second pour l'échelle basse
  21. (0xDC00-0xDFFF). Ils sont alors encodés comme des caractères UTF-8 standards sur
  22. six octets. La représentation UTF-8 standard utilise elle 4 octets pour les
  23. caractères supplémentaires.
  24. </para>
  25. </footnote>
  26. </para>
  27. <para>
  28. L'encodage des caractères d'entrée peut être spécifié grâce à l'API de
  29. <classname>Zend_Search_Lucene</classname>. Les données seront converties automatiquement
  30. en UTF-8.
  31. </para>
  32. </sect2>
  33. <sect2 id="zend.search.lucene.charset.default_analyzer">
  34. <title>Analyseur de texte par défaut</title>
  35. <para>
  36. Cependant, l'analyseur de texte par défaut (aussi utilisé par l'analyseur de
  37. requête) utilise <methodname>ctype_alpha()</methodname>.
  38. </para>
  39. <para>
  40. <methodname>ctype_alpha()</methodname> n'est pas compatible UTF-8, donc l'analyseur convertit
  41. le texte vers "ASCII//TRANSLIT" avant l'indexation. Le même processus est utilisé de
  42. manière transparente lors du requêtage. <footnote>
  43. <para>
  44. La conversion vers 'ASCII//TRANSLIT' peut dépendre de la locale courante
  45. ou de l'OS.
  46. </para>
  47. </footnote>
  48. </para>
  49. <note>
  50. <title></title>
  51. <para>
  52. L'analyseur par défaut isole les chiffres. Utilisez le parseur "Num" si vous
  53. voulez que les chiffres soient considérés comme des mots.
  54. </para>
  55. </note>
  56. </sect2>
  57. <sect2 id="zend.search.lucene.charset.utf_analyzer">
  58. <title>Analyseurs de texte compatibles UTF-8</title>
  59. <para>
  60. <classname>Zend_Search_Lucene</classname> contient aussi des analyseurs
  61. compatibles UTF-8 :
  62. <classname>Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8</classname>,
  63. <classname>Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8Num</classname>,
  64. <classname>Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8_CaseInsensitive</classname>,
  65. <classname>Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8Num_CaseInsensitive</classname>.
  66. </para>
  67. <para>
  68. N'importe quel analyseur peut être activé avec un code comme celui-ci:
  69. <programlisting language="php"><![CDATA[
  70. Zend_Search_Lucene_Analysis_Analyzer::setDefault(
  71. new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8());
  72. ]]></programlisting>
  73. </para>
  74. <warning>
  75. <title></title>
  76. <para>
  77. Les analyseurs UTF-8 ont été améliorés dans Zend Framework 1.5. Les anciennes
  78. versions considéraient les caractères non-ASCII comme des lettres. Les nouveaux
  79. analyseurs sont quant à eux plus précis sur ce point.
  80. </para>
  81. <para>
  82. Ceci pourrait vous obliger à reconstruire votre index afin que vos données et
  83. vos requêtes de recherche soient au même format. Des résultats faux peuvent
  84. apparaître sinon.
  85. </para>
  86. </warning>
  87. <para>
  88. Tous ces analyseurs nécessitent que la libraire PCRE (Perl-compatible regular
  89. expressions) soit compilée avec le support d'UTF-8. Ce support d'UTF-8 pour PCRE est
  90. activé par défaut dans les sources des libraires PCRE livrées avec <acronym>PHP</acronym>, mais si vous
  91. avez utilisé des librairies partagées pour la compilation de <acronym>PHP</acronym>, alors le support
  92. d'UTF-8 peut dépendre de l'OS.
  93. </para>
  94. <para>
  95. Utilisez ce code pour vérifier si le support d'UTF-8 est assuré pour PCRE :
  96. <programlisting language="php"><![CDATA[
  97. if (@preg_match('/\pL/u', 'a') == 1) {
  98. echo "support UTF-8 pour PCRE activé.\n";
  99. } else {
  100. echo "support UTF-8 pour PCRE désactivé.\n";
  101. }
  102. ]]></programlisting></para>
  103. <para>
  104. Les analyseurs UTF-8 insensibles à la casse ont aussi besoin de l'extension <ulink
  105. url="http://www.php.net/manual/en/ref.mbstring.php">mbstring</ulink> pour être
  106. activés.
  107. </para>
  108. <para>
  109. Si vous voulez les analyseurs UTF-8 insensibles à la casse, mais que vous n'avez
  110. pas mbstring, normalisez alors vos données avant de les indexer ainsi que vos requêtes
  111. avant vos recherches, ceci en les tranformant en casse minuscule : <programlisting
  112. role="php"><![CDATA[
  113. // Indexation
  114. setlocale(LC_CTYPE, 'de_DE.iso-8859-1');
  115. ...
  116. Zend_Search_Lucene_Analysis_Analyzer::setDefault(
  117. new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8());
  118. ...
  119. $doc = new Zend_Search_Lucene_Document();
  120. $doc->addField(Zend_Search_Lucene_Field::UnStored(
  121. 'contents', strtolower($contents))
  122. );
  123. // champ titre (indexed, unstored)
  124. $doc->addField(Zend_Search_Lucene_Field::UnStored(
  125. 'title', strtolower($title))
  126. );
  127. // champ titre (unindexed, stored)
  128. $doc->addField(Zend_Search_Lucene_Field::UnIndexed('_title', $title));
  129. ]]></programlisting> <programlisting language="php"><![CDATA[
  130. // Recherche
  131. setlocale(LC_CTYPE, 'de_DE.iso-8859-1');
  132. ...
  133. Zend_Search_Lucene_Analysis_Analyzer::setDefault(
  134. new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8());
  135. ...
  136. $hits = $index->find(strtolower($query));
  137. ]]></programlisting></para>
  138. </sect2>
  139. </sect1>