Zend_Search_Lucene-IndexCreation.xml 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 24249 -->
  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ährend 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/2_3_0/fileformats.html">http://lucene.apache.org/java/2_3_0/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 PHP_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 <acronym>RAM</acronym> verbraucht und Suchabfragen auf nicht
  197. optimierte Indizes sind schneller, aber die Indizierungsgeschwindigkeit ist
  198. langsamer. Bei größeren Werten, wird mehr beim Indizieren <acronym>RAM</acronym>
  199. verbraucht und während Suchabfragen auf nicht optimierte Indizes langsamer sind, ist
  200. das Indizieren schneller. Deshalb sind größere Werte (&gt; 10) am besten für
  201. Stapelverarbeitung und kleinere Werte (&lt; 10) sind besser für Indizes, die
  202. interaktiv gepflegt werden.
  203. </para>
  204. <para>
  205. <emphasis>MergeFactor</emphasis> ist eine gute Annahme für die durchschnittliche
  206. Anzahl an Segmenten die durch einen Auto-Optimierungs Durchgang zusammengeführt
  207. werden. Zu große Werte produzieren eine große Anzahl an Segmenten während diese nicht
  208. in einen neuen zusammengeführt werden. Das kann eine "failed to open stream: Too
  209. many open files" Fehlernachricht sein. Diese Begrenzung ist Sytemabhängig.
  210. </para>
  211. <para>
  212. <emphasis>MergeFactor</emphasis> kann abgefragt bzw. gesetzt werden durch Aufrufe
  213. von <code>$index->getMergeFactor()</code> oder
  214. <code>$index->setMergeFactor($mergeFactor)</code>.
  215. </para>
  216. <para>
  217. Standardwert ist 10.
  218. </para>
  219. <para>
  220. Lucene Java und Luke (Lucene Index Toolbox - <ulink
  221. url="http://www.getopt.org/luke/">http://www.getopt.org/luke/</ulink>) können
  222. auch für die Optimierung eines Index verwendet werden. Das letzte Luke Relese (v0.8)
  223. basiert auf Lucene v2.3 und ist kompatibel mit den aktuellen Implementation der
  224. <classname>Zend_Search_Lucene</classname> Komponente (Zend Framework 1.6). Frühere
  225. Versionen der <classname>Zend_Search_Lucene</classname> Implementation benötigen
  226. andere Versionen des Java Lucene Tools um kompatibel zu sein:
  227. <itemizedlist>
  228. <listitem>
  229. <para>
  230. Zend Framework 1.5 - Java Lucene 2.1 (Luke Tool v0.7.1 - <ulink
  231. url="http://www.getopt.org/luke/luke-0.7.1/"/>)
  232. </para>
  233. </listitem>
  234. <listitem>
  235. <para>
  236. Zend Framework 1.0 - Java Lucene 1.4 - 2.1 (Luke Tool v0.6 - <ulink
  237. url="http://www.getopt.org/luke/luke-0.6/"/>)
  238. </para>
  239. </listitem>
  240. </itemizedlist>
  241. </para>
  242. </sect3>
  243. </sect2>
  244. <sect2 id="zend.search.lucene.index-creation.permissions">
  245. <title>Berechtigungen</title>
  246. <para>
  247. Index Dateien sind standardmäßig für jeden lesbar und beschreibbar.
  248. </para>
  249. <para>
  250. Es ist möglich das mit der
  251. <methodname>Zend_Search_Lucene_Storage_Directory_Filesystem::setDefaultFilePermissions()</methodname>
  252. Methode zu überschreiben.
  253. </para>
  254. <programlisting language="php"><![CDATA[
  255. // Die aktuelle Datei Berechtigung erhalten
  256. $currentPermissions =
  257. Zend_Search_Lucene_Storage_Directory_Filesystem::getDefaultFilePermissions();
  258. // Nur für aktuellen Benutzer und Gruppe die Lese-Schreib Berechtigung setzen
  259. Zend_Search_Lucene_Storage_Directory_Filesystem::setDefaultFilePermissions(0660);
  260. ]]></programlisting>
  261. </sect2>
  262. <sect2 id="zend.search.lucene.index-creation.limitations">
  263. <title>Einschränkungen</title>
  264. <sect3 id="zend.search.lucene.index-creation.limitations.index-size">
  265. <title>Indexgröße</title>
  266. <para>
  267. Die Indexgröße ist limitiert mit 2GB für 32-bit Platformen.
  268. </para>
  269. <para>
  270. Verwende 64-bit Platformen für größere Indezes.
  271. </para>
  272. </sect3>
  273. <sect3 id="zend.search.lucene.index-creation.limitations.filesystems">
  274. <title>Unterstützte Dateisysteme</title>
  275. <para>
  276. <classname>Zend_Search_Lucene</classname> verwendet <methodname>flock()</methodname>
  277. um gleichzeitiges Suchen, Updaten und Optimierung des Index zu unterstützen.
  278. </para>
  279. <para>
  280. Entsprechend der <acronym>PHP</acronym> <ulink
  281. url="http://www.php.net/manual/de/function.flock.php">Dokumentation</ulink>,
  282. "funktioniert <methodname>flock()</methodname> nicht auf NFS und vielen anderen
  283. Netzwerk Dateisystemen".
  284. </para>
  285. <para>
  286. Verwende keine Netzwerk Dateisysteme mit <classname>Zend_Search_Lucene</classname>.
  287. </para>
  288. </sect3>
  289. </sect2>
  290. </sect1>