Zend_Search_Lucene-IndexCreation.xml 14 KB

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