Zend_Search_Lucene-IndexCreation.xml 14 KB

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