Zend_Search_Lucene-IndexCreation.xml 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 15215 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.search.lucene.index-creation">
  5. <title>Indexerstellung</title>
  6. <sect2 id="zend.search.lucene.index-creation.creating">
  7. <title>Einen neuen Index erstellen</title>
  8. <para>
  9. Die Funktionen für das Erstellen und Aktualisieren eines Index wurden innerhalb der
  10. <classname>Zend_Search_Lucene</classname> Komponente implementiert genau wie im Java Lucene Projekt. Man kann beide dieser
  11. Optionen verwenden um einen Index zu erstellen der mit <classname>Zend_Search_Lucene</classname> durchsucht werden kann.
  12. </para>
  13. <para>
  14. Der PHP Quellcode unten zeigt ein Beispiel, wie eine Datei durch Verwendung der
  15. <classname>Zend_Search_Lucene</classname> API indiziert werden kann:
  16. </para>
  17. <programlisting role="php"><![CDATA[
  18. // Index erstellen
  19. $index = Zend_Search_Lucene::create('/data/my-index');
  20. $doc = new Zend_Search_Lucene_Document();
  21. // Speichere die URL des Dokuments,
  22. // um sie in Suchergebnissen ermitteln zu können
  23. $doc->addField(Zend_Search_Lucene_Field::Text('url', $docUrl));
  24. // Inhalte des Dokumentenindex
  25. $doc->addField(Zend_Search_Lucene_Field::UnStored('contents', $docContent));
  26. // Füge das Dokument dem Index hinzu
  27. $index->addDocument($doc);
  28. ]]></programlisting>
  29. <para>
  30. Neu hinzugefügte Dokumente können sofort im Index gesucht werden.
  31. </para>
  32. </sect2>
  33. <sect2 id="zend.search.lucene.index-creation.updating">
  34. <title>Indexaktualisierung</title>
  35. <para>
  36. Der selbe Prozess wird verwendet, um einen vorhandenen Index zu aktualisieren. Der
  37. einzige Unterschied ist, dass die open() Methode statt der create() Methode aufgerufen
  38. wird:
  39. </para>
  40. <programlisting role="php"><![CDATA[
  41. // Öffnen einen vorhandenen Index
  42. $index = Zend_Search_Lucene::open('/data/my-index');
  43. $doc = new Zend_Search_Lucene_Document();
  44. // Speichere die URL des Dokuments, um es für Suchergebnisse ermitteln zu können
  45. $doc->addField(Zend_Search_Lucene_Field::Text('url', $docUrl));
  46. // Indiziere den Dokumenteninhalt
  47. $doc->addField(Zend_Search_Lucene_Field::UnStored('contents',
  48. $docContent));
  49. // Füge das Dokument dem Index hinzu
  50. $index->addDocument($doc);
  51. ]]></programlisting>
  52. </sect2>
  53. <sect2 id="zend.search.lucene.index-creation.document-updating">
  54. <title>Dokumente aktualisieren</title>
  55. <para>
  56. Das Lucene Indexdateiformat unterstützt keine Aktualisierung von Dokumenten. Ein
  57. Dokument sollte entfernt und wieder hinzugefügt werden um es effektiv zu Aktualisieren.
  58. </para>
  59. <para>
  60. Die <classname>Zend_Search_Lucene::delete()</classname> Methode arbeitet mit einer internen
  61. Index Dokumentennummer. Sie kann aus dem Ergebnistreffer über die 'id' Eigenschaft
  62. erhalten werden:
  63. </para>
  64. <programlisting role="php"><![CDATA[
  65. $removePath = ...;
  66. $hits = $index->find('path:' . $removePath);
  67. foreach ($hits as $hit) {
  68. $index->delete($hit->id);
  69. }
  70. ]]></programlisting>
  71. </sect2>
  72. <sect2 id="zend.search.lucene.index-creation.counting">
  73. <title>Die Größe des Index erhalten</title>
  74. <para>
  75. Es gibt zwei Methoden um die Größe eines Index in <classname>Zend_Search_Lucene</classname> zu erhalten.
  76. </para>
  77. <para>
  78. <classname>Zend_Search_Lucene::maxDoc()</classname> gibt einen Mehr als die größte Anzahl an Dokumenten zurück.
  79. Das ist die Gesamtanzahl der Dokumente im Index inklusive gelöschter Dokumente. Deswegen hat
  80. es das Synonym: <classname>Zend_Search_Lucene::count()</classname>.
  81. </para>
  82. <para>
  83. <classname>Zend_Search_Lucene::numDocs()</classname> gibt die Gesamtanzahl an nicht gelöschten Dokumenten zurück.
  84. </para>
  85. <programlisting role="php"><![CDATA[
  86. $indexSize = $index->count();
  87. $documents = $index->numDocs();
  88. ]]></programlisting>
  89. <para>
  90. Die Methode <classname>Zend_Search_Lucene::isDeleted($id)</classname> kann verwendet werden um zu Prüfen ob ein
  91. Dokument gelöscht ist.
  92. </para>
  93. <programlisting role="php"><![CDATA[
  94. for ($count = 0; $count < $index->maxDoc(); $count++) {
  95. if ($index->isDeleted($count)) {
  96. echo "Dokument #$id ist gelöscht.\n";
  97. }
  98. }
  99. ]]></programlisting>
  100. <para>
  101. Index Optimierung entfernt gelöschte Dokumente und quetscht die Dokument Ids in einen kleineren
  102. Bereich. Die interne Id des Dokuments könnte also wärend der Indexoptinierung verändert werden.
  103. </para>
  104. </sect2>
  105. <sect2 id="zend.search.lucene.index-creation.optimization">
  106. <title>Indexoptimierung</title>
  107. <para>
  108. Ein Lucene Index besteht aus Segmenten. Jedes Segment ist ein komplett unabhängiges Set von Daten.
  109. </para>
  110. <para>
  111. Lucene Indexsegmentdateien können aufgrund ihres Designs nicht aktualisiert werden. Eine Segmentaktualisierung
  112. benötigt eine komplette Reorganisation der Segmente. Siehe auch die Lucene Indexdateiformate für weitere
  113. Details
  114. (<ulink url="http://lucene.apache.org/java/docs/fileformats.html">http://lucene.apache.org/java/docs/fileformats.html</ulink>).
  115. <footnote>
  116. <para>
  117. Die aktuell unterstützte Version des Lucene Index File Formats ist 2.3 (beginnend mit
  118. ZF 1.6).
  119. </para>
  120. </footnote>.
  121. Neue Dokumente werden durch Erstellen neuer Segmente zum Index hinzugefügt.
  122. </para>
  123. <para>
  124. Eine steigende Anzahl an Segmente verringert die Qualität des Index, aber die Indexoptimierung stellt
  125. diese wieder her. Die Optimierung verschiebt verschiedene Segmente in ein neues. Dieser Prozess
  126. aktualisiert die Segmente auch nicht. Es erzeugt ein neues großes Segment und aktualisiert die
  127. Segmentliste (die 'sements' Datei).
  128. </para>
  129. <para>
  130. Eine komplette Indexoptimierung kann durch einen Aufruf von <classname>Zend_Search_Lucene::optimize()</classname>
  131. getriggert werden. Sie fügt alle Segmente in ein größeres zusammen.
  132. </para>
  133. <programlisting role="php"><![CDATA[
  134. // Öffne bestehenden Index
  135. $index = new Zend_Search_Lucene('/data/my-index');
  136. // Optimiere Index
  137. $index->optimize();
  138. ]]></programlisting>
  139. <para>
  140. Die automatische Indexoptimierung wird durchgeführt, um einen Index in einem konsistenten Status
  141. zu halten.
  142. </para>
  143. <para>
  144. Die automatische Indexoptimierung ist ein schrittweise Prozess, der durch verschiedene Indexoptionen gesteuert
  145. wird. Sie fasst sehr kleine Segmente in größere zusammen und fasst die größeren Segmente dann in noch größere
  146. zusammen und so weiter.
  147. </para>
  148. <sect3 id="zend.search.lucene.index-creation.optimization.maxbuffereddocs">
  149. <title>MaxBufferedDocs Option für automatische Optimierung</title>
  150. <para>
  151. <emphasis>MaxBufferedDocs</emphasis> ist die minimale Anzahl an Dokumenten, die erforderlich ist, damit
  152. die im Hauptspeicher zwischen gespeicherten Dokumente in ein neues Segment geschrieben werden.
  153. </para>
  154. <para>
  155. <emphasis>MaxBufferedDocs</emphasis> kann abgefragt bzw. gesetzt werden durch Aufrufe von
  156. <code>$index->getMaxBufferedDocs()</code> oder <code>$index->setMaxBufferedDocs($maxBufferedDocs)</code>.
  157. </para>
  158. <para>
  159. Standardwert is 10.
  160. </para>
  161. </sect3>
  162. <sect3 id="zend.search.lucene.index-creation.optimization.maxmergedocs">
  163. <title>MaxMergeDocs Option für automatische Optimierung</title>
  164. <para>
  165. <emphasis>MaxMergeDocs</emphasis> ist die höchste Anzahl an Dokumenten, die jemals mit addDocument()
  166. zusammengefasst werden kann. Kleine Werte (z.B. unter 10.000) sind für die interaktive Indizierung am
  167. besten, da dies die Pausen für das Indizieren auf wenige Sekunden begrenzen. Größere Werte sind am besten
  168. für Stapelverarbeitung oder schnellere Suchabfragen.
  169. </para>
  170. <para>
  171. <emphasis>MaxMergeDocs</emphasis> kann abgefragt bzw. gesetzt werden durch Aufrufe von
  172. <code>$index->getMaxMergeDocs()</code> oder <code>$index->setMaxMergeDocs($maxMergeDocs)</code>.
  173. </para>
  174. <para>
  175. Standardwert ist PHP_INT_MAX.
  176. </para>
  177. </sect3>
  178. <sect3 id="zend.search.lucene.index-creation.optimization.mergefactor">
  179. <title>MergeFactor Option für automatische Optimierung</title>
  180. <para>
  181. <emphasis>MergeFactor</emphasis> legt fest, wie oft Segmentenindixes durch addDocument() zusammengefasst
  182. werden sollen. Bei kleineren Werten wird beim Indizieren weniger RAM verbraucht und Suchabfragen auf
  183. nicht optimierte Indizes sind schneller, aber die Indizierungsgeschwindigkeit ist langsamer. Bei größeren
  184. Werten, wird mehr beim Indizieren RAM verbraucht und während Suchabfragen auf nicht optimierte Indizes langsamer
  185. sind, ist das Indizieren schneller. Deshalb sind größere Werte (&gt; 10) am besten für Stapelverarbeitung
  186. und kleinere Werte (&lt; 10) sind besser für Indizes, die interaktiv gepflegt werden.
  187. </para>
  188. <para>
  189. <emphasis>MergeFactor</emphasis> ist eine gute Annahme für die durchschnittliche Anzahl an Segmenten
  190. die durch einen Auto-Optimierungs Durchgang zusammengeführt werden. Zu große Werte produzieren
  191. eine große Anzahl an Segmenten wärend diese nicht in einen neuen zusammengeführt werden. Das kann
  192. eine "failed to open stream: Too many open files" Fehlernachricht sein. Diese Begrenzung ist
  193. Sytemabhängig.
  194. </para>
  195. <para>
  196. <emphasis>MergeFactor</emphasis> kann abgefragt bzw. gesetzt werden durch Aufrufe von
  197. <code>$index->getMergeFactor()</code> oder <code>$index->setMergeFactor($mergeFactor)</code>.
  198. </para>
  199. <para>
  200. Standardwert ist 10.
  201. </para>
  202. <para>
  203. Lucene Java und Luke (Lucene Index Toolbox - <ulink url="http://www.getopt.org/luke/">http://www.getopt.org/luke/</ulink>)
  204. können auch für die Optimierung eines Index verwendet werden. Das letzte Luke Relese (v0.8)
  205. basiert auf Lucene v2.3 und ist kompatibel mit den aktuellen Implementation der
  206. <classname>Zend_Search_Lucene</classname> Komponente (ZF 1.6). Frühere Versionen der <classname>Zend_Search_Lucene</classname>
  207. Implementation benötigen andere Versionen des Java Lucene Tools um kompatibel zu sein:
  208. <itemizedlist>
  209. <listitem>
  210. <para>ZF 1.5 - Java Lucene 2.1 (Luke Tool v0.7.1 - <ulink url="http://www.getopt.org/luke/luke-0.7.1/"/>)</para>
  211. </listitem>
  212. <listitem>
  213. <para>ZF 1.0 - Java Lucene 1.4 - 2.1 (Luke Tool v0.6 - <ulink url="http://www.getopt.org/luke/luke-0.6/"/>)</para>
  214. </listitem>
  215. </itemizedlist>
  216. </para>
  217. </sect3>
  218. </sect2>
  219. <sect2 id="zend.search.lucene.index-creation.permissions">
  220. <title>Berechtigungen</title>
  221. <para>
  222. Index Dateien sind standardmäßig für jeden lesbar und beschreibbar.
  223. </para>
  224. <para>
  225. Es ist möglich das mit der
  226. <classname>Zend_Search_Lucene_Storage_Directory_Filesystem::setDefaultFilePermissions()</classname>
  227. Methode zu überschreiben.
  228. </para>
  229. <programlisting role="php"><![CDATA[
  230. // Die aktuelle Datei Berechtigung erhalten
  231. $currentPermissions =
  232. Zend_Search_Lucene_Storage_Directory_Filesystem::getDefaultFilePermissions();
  233. // Nur für aktuellen Benutzer und Gruppe die Lese-Schreib Berechtigung setzen
  234. Zend_Search_Lucene_Storage_Directory_Filesystem::setDefaultFilePermissions(0660);
  235. ]]></programlisting>
  236. </sect2>
  237. <sect2 id="zend.search.lucene.index-creation.limitations">
  238. <title>Einschränkungen</title>
  239. <sect3 id="zend.search.lucene.index-creation.limitations.index-size">
  240. <title>Indexgröße</title>
  241. <para>
  242. Die Indexgröße ist limitiert mit 2GB für 32-bit Platformen.
  243. </para>
  244. <para>
  245. Verwende 64-bit Platformen für größere Indezes.
  246. </para>
  247. </sect3>
  248. <sect3 id="zend.search.lucene.index-creation.limitations.filesystems">
  249. <title>Unterstützte Dateisysteme</title>
  250. <para>
  251. <classname>Zend_Search_Lucene</classname> verwendet <code>flock()</code> um gleichzeitiges Suchen, Updaten und
  252. Optimierung des Index zu unterstützen.
  253. </para>
  254. <para>
  255. Entsprechend der PHP <ulink url="http://www.php.net/manual/de/function.flock.php">Dokumentation</ulink>,
  256. "funktioniert <code>flock()</code> nicht auf NFS und vielen anderen Netzwerk Dateisystemen".
  257. </para>
  258. <para>
  259. Verwende keine Netzwerk Dateisysteme mit <classname>Zend_Search_Lucene</classname>.
  260. </para>
  261. </sect3>
  262. </sect2>
  263. </sect1>
  264. <!--
  265. vim:se ts=4 sw=4 et:
  266. -->