Indexes Bouwen
Een Nieuwe Index Maken
De mogelijkheid om nieuwe Indexes te maken en ze up te daten is geïmplementeerd in de Zend_Search_Lucene
module en Java Lucene.
Je kan beide mogelijkheden gebruiken.
Het volgende PHP code voorbeeld geeft een voorbeeld van hoe een bestand
kan worden geïndexeerd door de Zend_Search_Lucene indexing API te gebruiken:
addField(Zend_Search_Lucene_Field::Text('url', $docUrl));
// Documentinhoud indexeren
$doc->addField(Zend_Search_Lucene_Field::UnStored('inhoud', $docContent));
// Een document aan de index toevoegen.
$index->addDocument($doc);
// De veranderingen naar de index schrijven.
$index->commit();
?>]]>
Nieuw toegevoegde documenten kunnen na de commit operatie van de index worden
verkregen.
Zend_Search_Lucene::commit() wordt automatisch opgeroepen aan het einde
van de script uitvoering en vòòr elke zoekopdracht.
Elke oproep van commit() genereert een nieuw index segment.
Lucene index segment bestanden zijn niet updatebaar. Segment update noodzaakt een volledige
segment reorganisatie. Zie de Lucene index bestandsformaten voor details
(http://lucene.apache.org/java/docs/fileformats.html).
Het aantal segmenten opvoeren verlaagt de kwaliteit van de index, maar index optimalisatie herstelt dit.
Optimalisatie beperkt zich tot het bijeen voegen van verscheidene segmenten in één enkel segment. Dit
proces doet geen update van de segmenten. Het genereert een nieuw groot segment, een nieuwe segmentenlijst
('segments.new' bestand) dat het nieuwe segment bevat in plaats van de lijst van oude segmenten, en hernoemt
dan het bestand 'segments.new' naar 'segments'.
Optimalisatie is een iteratief proces. Vele kleine segmenten (die bijvoorbeeld werden gegenereerd door het
toevoegen van een document) worden in een groter samengevoegd en zo verder. Optimalisatie kan met een segment
stream werken en verbruikt niet veel geheugen. Samengevat: optimalisatie verbruikt weinig middelen, doet geen
lock op de index voor het zoeken, updaten of samenvoegen van andere segmenten.
Het moet dus zo weinig mogelijk worden gebruikt.
Aan de andere hand, het comitten van een groot aantal documenten in één keer verbruikt meer geheugen.
Automatisch segment management optimalisatie is onderdeel van de toekomstige Zend_Search_Lucene
verbeteringen.
Index Updaten
Dezelfde procedure wordt gebruikt om een bestaande index up te daten. Het enige verschil is dat de index
zou moeten worden geopend zonder tweede parameter:
addField(Zend_Search_Lucene_Field::Text('url', $docUrl));
// Documentinhoud indexeren
$doc->addField(Zend_Search_Lucene_Field::UnStored('inhoud', $docContent));
// Een document aan de index toevoegen.
$index->addDocument($doc);
// De veranderingen naar de index schrijven.
$index->commit();
?>]]>
Elke oproep (impliciet of expliciet) aan commit() genereert een nieuw index segment.
Zend_Search_Lucene beheert segmenten niet automatisch. Je moet dus rekening houden met segmentgroottes.
Een groot segment is meer optimaal, maar heeft meer geheugen nodig tijdens zijn creatie.
Lucene Java en Luke (Lucene Index Toolbox - http://www.getopt.org/luke/)
kunnen worden geraadpleegd om indexes te optimaliseren met deze versie van Zend_Search_Lucene.
Documenten updaten
Het Lucene index bestandformaat ondersteund het updaten van documenten niet. Documenten zouden moeten worden
verwijderd en opnieuw toegevoegd worden om de index up te daten.
De Zend_Search_Lucene::delete() methode werkt met een intern document id index. Deze kan worden
bekomen via een query hit per 'id' eigenschap:
find('path:' . $removePath);
foreach ($hits as $hit) {
$index->delete($hit->id);
}
$index->commit();
?>]]>