Zend_Search_Lucene-Charset.xml 5.9 KB

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