Zend_Search_Lucene-IndexCreation.xml 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. <sect1 id="zend.search.lucene.index-creation">
  2. <title>Indexes Bouwen</title>
  3. <sect2 id="zend.search.lucene.index-creation.creating">
  4. <title>Een Nieuwe Index Maken</title>
  5. <para>
  6. De mogelijkheid om nieuwe Indexes te maken en ze up te daten is geïmplementeerd in de Zend_Search_Lucene
  7. module en Java Lucene.
  8. Je kan beide mogelijkheden gebruiken.
  9. </para>
  10. <para>
  11. Het volgende PHP code voorbeeld geeft een voorbeeld van hoe een bestand
  12. kan worden geïndexeerd door de Zend_Search_Lucene indexing API te gebruiken:
  13. </para>
  14. <programlisting role="php"><![CDATA[<?php
  15. // Het tweede argument naar TRUE zetten maakt een nieuwe index
  16. $index = new Zend_Search_Lucene('/data/mijn-index', true);
  17. $doc = new Zend_Search_Lucene_Document();
  18. // De document URL opslaan om het in het zoekresultaat te identificeren.
  19. $doc->addField(Zend_Search_Lucene_Field::Text('url', $docUrl));
  20. // Documentinhoud indexeren
  21. $doc->addField(Zend_Search_Lucene_Field::UnStored('inhoud', $docContent));
  22. // Een document aan de index toevoegen.
  23. $index->addDocument($doc);
  24. // De veranderingen naar de index schrijven.
  25. $index->commit();
  26. ?>]]></programlisting>
  27. <para>
  28. Nieuw toegevoegde documenten kunnen na de commit operatie van de index worden
  29. verkregen.
  30. </para>
  31. <para>
  32. <code>Zend_Search_Lucene::commit()</code> wordt automatisch opgeroepen aan het einde
  33. van de script uitvoering en vòòr elke zoekopdracht.
  34. </para>
  35. <para>
  36. Elke oproep van commit() genereert een nieuw index segment.
  37. <footnote>
  38. <para>
  39. Lucene index segment bestanden zijn niet updatebaar. Segment update noodzaakt een volledige
  40. segment reorganisatie. Zie de Lucene index bestandsformaten voor details
  41. (<ulink url="http://lucene.apache.org/java/docs/fileformats.html">http://lucene.apache.org/java/docs/fileformats.html</ulink>).
  42. Het aantal segmenten opvoeren verlaagt de kwaliteit van de index, maar index optimalisatie herstelt dit.
  43. Optimalisatie beperkt zich tot het bijeen voegen van verscheidene segmenten in één enkel segment. Dit
  44. proces doet geen update van de segmenten. Het genereert een nieuw groot segment, een nieuwe segmentenlijst
  45. ('segments.new' bestand) dat het nieuwe segment bevat in plaats van de lijst van oude segmenten, en hernoemt
  46. dan het bestand 'segments.new' naar 'segments'.
  47. </para>
  48. <para>
  49. Optimalisatie is een iteratief proces. Vele kleine segmenten (die bijvoorbeeld werden gegenereerd door het
  50. toevoegen van een document) worden in een groter samengevoegd en zo verder. Optimalisatie kan met een segment
  51. stream werken en verbruikt niet veel geheugen. Samengevat: optimalisatie verbruikt weinig middelen, doet geen
  52. lock op de index voor het zoeken, updaten of samenvoegen van andere segmenten.
  53. </para>
  54. </footnote>
  55. Het moet dus zo weinig mogelijk worden gebruikt.
  56. Aan de andere hand, het comitten van een groot aantal documenten in één keer verbruikt meer geheugen.
  57. </para>
  58. <para>
  59. Automatisch segment management optimalisatie is onderdeel van de toekomstige Zend_Search_Lucene
  60. verbeteringen.
  61. </para>
  62. </sect2>
  63. <sect2 id="zend.search.lucene.index-creation.updating">
  64. <title>Index Updaten</title>
  65. <para>
  66. Dezelfde procedure wordt gebruikt om een bestaande index up te daten. Het enige verschil is dat de index
  67. zou moeten worden geopend zonder tweede parameter:
  68. </para>
  69. <programlisting role="php"><![CDATA[<?php
  70. // Een bestaande index openen
  71. $index = new Zend_Search_Lucene('/data/mijn-index');
  72. $doc = new Zend_Search_Lucene_Document();
  73. // Het document URL opslaan om het in het zoekresultaat te identificeren.
  74. $doc->addField(Zend_Search_Lucene_Field::Text('url', $docUrl));
  75. // Documentinhoud indexeren
  76. $doc->addField(Zend_Search_Lucene_Field::UnStored('inhoud', $docContent));
  77. // Een document aan de index toevoegen.
  78. $index->addDocument($doc);
  79. // De veranderingen naar de index schrijven.
  80. $index->commit();
  81. ?>]]></programlisting>
  82. <para>
  83. Elke oproep (impliciet of expliciet) aan commit() genereert een nieuw index segment.
  84. </para>
  85. <para>
  86. Zend_Search_Lucene beheert segmenten niet automatisch. Je moet dus rekening houden met segmentgroottes.
  87. Een groot segment is meer optimaal, maar heeft meer geheugen nodig tijdens zijn creatie.
  88. </para>
  89. <para>
  90. Lucene Java en Luke (Lucene Index Toolbox - <ulink url="http://www.getopt.org/luke/">http://www.getopt.org/luke/</ulink>)
  91. kunnen worden geraadpleegd om indexes te optimaliseren met deze versie van Zend_Search_Lucene.
  92. </para>
  93. </sect2>
  94. <sect2 id="zend.search.lucene.index-creation.document-updating">
  95. <title>Documenten updaten</title>
  96. <para>
  97. Het Lucene index bestandformaat ondersteund het updaten van documenten niet. Documenten zouden moeten worden
  98. verwijderd en opnieuw toegevoegd worden om de index up te daten.
  99. </para>
  100. <para>
  101. De <code>Zend_Search_Lucene::delete()</code> methode werkt met een intern document id index. Deze kan worden
  102. bekomen via een query hit per 'id' eigenschap:
  103. </para>
  104. <programlisting role="php"><![CDATA[<?php
  105. $removePath = ...;
  106. $hits = $index->find('path:' . $removePath);
  107. foreach ($hits as $hit) {
  108. $index->delete($hit->id);
  109. }
  110. $index->commit();
  111. ?>]]></programlisting>
  112. </sect2>
  113. </sect1>
  114. <!--
  115. vim:se ts=4 sw=4 et:
  116. -->