Zend_Search_Lucene-Charset.xml 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 15157 -->
  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 <code>ctype_alpha()</code>.
  38. </para>
  39. <para>
  40. <code>ctype_alpha()</code> 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 PHP, mais si vous
  91. avez utilisé des librairies partagées pour la compilation de PHP, 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>