Zend_Search_Lucene-Charset.xml 6.9 KB

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