Zend_Search_Lucene-IndexCreation.xml 14 KB

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