Er zijn twee manieren om door een index te zoeken. De eerste methode gebruikt de Query Parser om een query op te bouwen van een string. De tweede bied de mogelijkheid je eigen queries te maken via de Zend_Search_Lucene API.
Alvorens te kiezen voor de aangeboden Query Parser, hou het volgende in gedachte:
Beide manieren gebruiken dezelfde API methode om door de index te zoeken:
<?php require_once('Zend/Search/Lucene.php'); $index = new Zend_Search_Lucene('/data/my_index'); $index->find($query); ?>
De Zend_Search_Lucene::find()
methode herkent automatisch het invoer type en gebruikt de query parser om het juiste Zend_Search_Lucene_Search_Query object
van een string te maken.
Het is belangrijk om te zien dat find()
case sensitive is. Standaard normaliseert LuceneIndexCreation.jar alle documenten naar kleine letters. Dit kan uitgezet worden met een command line switch (type LuceneIndexCreation.jar zonder argumenten voor hulp). De case van de tekst die aan find()
wordt doorgegeven moet overeenkomen met die in de index. Als de index is genormaliseerd naar kleine letters, dan dient alle tekst die aan find()
wordt doorgegeven worden onderworpen aan strtolower()
, anders worden mogelijk geen resultaten gevonden.
Het zoek resultaat is een array van Zend_Search_Lucene_Search_QueryHit objecten. Ieder van deze objecten heeft twee eigenschappen: $hit->document
is een documentnummer binnen de index en $hit->score
is een score van het resultaat binnen het volledige zoekresultaat. Resultaat wordt geordend op score (hoogste score komt eerst).
Het Zend_Search_Lucene_Search_QueryHit object bied daarnaast ook ieder veld van het gevonden Zend_Search_Lucene_Document als een eigenschap. In het volgende voorbeeld wordt een resultaat teruggegeven en heeft het document twee velden: title en author.
<?php require_once('Zend/Search/Lucene.php'); $index = new Zend_Search_Lucene('/data/my_index'); $hits = $index->find($query); foreach ($hits as $hit) { echo $hit->id; echo $hit->score; echo $hit->title; echo $hit->author; } ?>
Het originele Zend_Search_Lucene_Document object kan ook worden teruggegeven vanuit de Zend_Search_Lucene_Search_QueryHit.
Je kan geindexeerde delen van het document verkrijgen door gebruik te maken van de getDocument()
methode van het index object en dan de getFieldValue()
methode te gebruiken:
<?php require_once('Zend/Search/Lucene.php'); $index = new Zend_Search_Lucene('/data/my_index'); $hits = $index->find($query); foreach ($hits as $hit) { // geef een Zend_Search_Lucene_Document object terug voor dit resultaat echo $document = $hit->getDocument(); // geef een Zend_Search_Lucene_Field object terug // uit het Zend_Search_Lucene_Document echo $document->getField('title'); // geef de string waarde terug van een Zend_Search_Lucene_Field object echo $document->getFieldValue('title'); // hetzelfde als getFieldValue() echo $document->title; } ?>
De velden die beschikbaar zijn via het Zend_Search_Lucene_Document object worden besloten tijdens het indexeren. De document velden worden ofwel geindexeerd, ofwel geindexeerd en opgeslagen, in het document door de indexeringsapplicatie (bijvoorbeeld LuceneIndexCreation.jar).
Let op dat de document identiteit ('path' in het voorbeeld) ook wordt opgeslagen in de index en vanuit de index opgehaald dient te worden.
Zend_Search_Lucene gebruikt hetzelfde score algoritme als Java Lucene. Zoek resultaten worden geordend op score, met de hoogste score als eerst.
Een verschillende score betekent dat een document meer overeenkomt met de zoekopdracht dan de andere.
Ruwweg genomen wordt de zoekopdracht vaker gevonden in documenten met een hogere score dan in documenten met een lagere score.
Score kan worden verkregen via de score
eigenschap van het resultaat:
<?php $hits = $index->find($query); foreach ($hits as $hit) { echo $hit->id; echo $hit->score; } ?>
Zend_Search_Lucene_Search_Similarity klasse wordt gebruikt om de score te berekenen. Zie Uitbreidbaarheid. Scoring Algoritmes sectie voor details.