Zend_Search_Lucene-Charset.xml 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.search.lucene.charset">
  5. <title>Zeichensätze</title>
  6. <sect2 id="zend.search.lucene.charset.description">
  7. <title>Unterstützung für UTF-8 und Einzel-Byte Zeichensätze</title>
  8. <para>
  9. <classname>Zend_Search_Lucene</classname> arbeitet intern mit dem UTF-8 Zeichensatz.
  10. Indexdateien speichern Unicode Daten in Java's "modifiziertem UTF-8 Codierung". Der Kern
  11. von <classname>Zend_Search_Lucene</classname> unterstützt diesen Zeichensatz mit einer
  12. Ausnahme komplett.
  13. <footnote>
  14. <para>
  15. <classname>Zend_Search_Lucene</classname> unterstützt nur Basic Multilingual
  16. Plane (BMP) Zeichen (von 0x0000 bis 0xFFFF) und unterstützt keine "zusätzlichen
  17. Zeichen" (Zeichen deren Codepunkte größer als 0xFFFF sind).
  18. </para>
  19. <para>
  20. Java 2 zeigt diese Werte als Paare von Zeichen (16-bit) Werten an, der erste vom
  21. High-Surrogate Bereich (0xD800-0xDBFF), den zweiten vom Low-Surrogate Bereich
  22. (0xDC00-0xDFFF). Dann werden Sie als normale UTF-8 Zeichen mit sechs Bytes
  23. kodiert. Die Standard UTF-8 Repräsentation verwendet vier Bytes für zusätzliche
  24. Zeichen.
  25. </para>
  26. </footnote>
  27. </para>
  28. <para>
  29. Die Codierung der aktuellen Eingabedaten dann über die <acronym>API</acronym> von
  30. <classname>Zend_Search_Lucene</classname> spezifiziert werden. Daten werden automatisch
  31. in die UTF-8 Codierung konvertiert.
  32. </para>
  33. </sect2>
  34. <sect2 id="zend.search.lucene.charset.default_analyzer">
  35. <title>Standard Textanalysator</title>
  36. <para>
  37. Trotzdem verwendet der standardmäßige Textanalysator (welche auch im Anfrageparser
  38. arbeitet) ctype_alpha() für das analysieren von Text und Anfragen.
  39. </para>
  40. <para>
  41. ctype_alpha() ist nicht UTf-8 kompatibel, weswegen der Analysator Text zuerst in die
  42. 'ASCII//TRANSLIT' Codierung konvertiert bevor er indiziert. Die selbe Bearbeitung wird
  43. transparent während des Parsens der Abfrage durchgeführt
  44. <footnote>
  45. <para>
  46. Konvertierungen in 'ASCII//TRANSLIT' sind abhängig von dem aktuellen
  47. Gebietsschema und OS.
  48. </para>
  49. </footnote>
  50. </para>
  51. <note>
  52. <title/>
  53. <para>
  54. Der Standardanalysator behandelt Zahlen nicht als Teile von Ausdrücken. Wenn Wörter
  55. nicht durch Zahlen unterbrochen werden sollen kann der entsprechende 'Num'
  56. Analysator verwendet werden.
  57. </para>
  58. </note>
  59. </sect2>
  60. <sect2 id="zend.search.lucene.charset.utf_analyzer">
  61. <title>UTF-8 kompatibler Textanalysator</title>
  62. <para>
  63. <classname>Zend_Search_Lucene</classname> enthält auch ein Set von UTF-8 kompatiblen
  64. Analysatoren: <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. Jeder dieser Analysatoren kenn mit Code wie dem folgenden eingeschaltet werden:
  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. Die UTF-8 kompatiblen Analysatoren wurden in Zend Framework 1.5 verbessert. Frühere
  80. Versionen der Analysatoren nahmen an das alle nicht-Ascii Zeichen Buchstaben sind.
  81. Die neuen Analysatoren haben ein genaueres Verhalten.
  82. </para>
  83. <para>
  84. Deswegen kann es notwendig sein den Index neu zu erstellen um Daten und Suchanfragen
  85. auf die gleiche Art und Weise in Ausdrücke zerlegt zu haben, weil sonst andererseits
  86. die Suchmaschine falsche Ergebnissets zurückgeben könnte.
  87. </para>
  88. </warning>
  89. <para>
  90. Alle diese Analysatoren benötigen die PCRE (Perl-kompatible reguläre Ausdrücke)
  91. Bibliothek kompiliert mit eingeschalteter UTF-8 Unterstützung. PCRE UTF-8 Unterstützung
  92. ist für die PCRE Bibliotheks Quellcodes die mit den <acronym>PHP</acronym> Quellcodes
  93. gekoppelt sind, eingeschaltet, aber wenn eine andere Bibliothek als die vom
  94. <acronym>PHP</acronym> Quellcode verwendet wird, ist der Status der UTF-8 Unterstützung
  95. abhängig vom eigenen Betriebsystem.
  96. </para>
  97. <para>
  98. Der folgende Code kann verwendet werden um zu prüfen ob PCRE UTF-8 Unterstützung
  99. eingeschaltet ist:
  100. </para>
  101. <programlisting language="php"><![CDATA[
  102. if (@preg_match('/\pL/u', 'a') == 1) {
  103. echo "PCRE Unicode Unterstützung ist eingeschaltet.\n";
  104. } else {
  105. echo "PCRE Unicode Unterstützung ist ausgeschaltet.\n";
  106. }
  107. ]]></programlisting>
  108. <para>
  109. Groß-/Kleinschreibungs-unabhängige Versionen von UTF-8 kompatiblen Analysatoren
  110. erfordern das die <ulink
  111. url="http://www.php.net/manual/en/ref.mbstring.php">mbstring</ulink> Erweiterung
  112. aktiviert ist.
  113. </para>
  114. <para>
  115. Wenn man die mbstring Erweiterung nicht einschalten will, und trotzdem
  116. Groß-/Kleinschreibungs unabhängige Suchen benötigt, kann die folgende Vorgehensweise
  117. verwendet werden: Quelldaten vor der Indizierung und Abfragestring for der Suche
  118. normalisieren indem diese zur Kleinschreibung konvertiert werden:
  119. </para>
  120. <programlisting language="php"><![CDATA[
  121. // Indizierung
  122. setlocale(LC_CTYPE, 'de_DE.iso-8859-1');
  123. ...
  124. Zend_Search_Lucene_Analysis_Analyzer::setDefault(
  125. new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8());
  126. ...
  127. $doc = new Zend_Search_Lucene_Document();
  128. $doc->addField(Zend_Search_Lucene_Field::UnStored('contents',
  129. strtolower($contents)));
  130. // Titel Feld für das Durchsuchen (indiziert, nicht gespeichert)
  131. $doc->addField(Zend_Search_Lucene_Field::UnStored('title',
  132. strtolower($title)));
  133. // Titel Feld für das Empfangen (nicht indiziert, gespeichert)
  134. $doc->addField(Zend_Search_Lucene_Field::UnIndexed('_title', $title));
  135. ]]></programlisting>
  136. <programlisting language="php"><![CDATA[
  137. // Suche
  138. setlocale(LC_CTYPE, 'de_DE.iso-8859-1');
  139. ...
  140. Zend_Search_Lucene_Analysis_Analyzer::setDefault(
  141. new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8());
  142. ...
  143. $hits = $index->find(strtolower($query));
  144. ]]></programlisting>
  145. </sect2>
  146. </sect1>