Hoofdstuk 27. Zend_Search_Lucene

Inhoudsopgave

27.1. Overzicht
27.1.1. Inleiding
27.1.2. Document en Veld Objecten
27.1.3. Veld Types Begrijpen
27.2. Indexes Bouwen
27.2.1. Een Nieuwe Index Maken
27.2.2. Index Updaten
27.2.3. Documenten updaten
27.3. Het doorzoeken van een index
27.3.1. Opbouwen van Queries
27.3.2. Zoek resultaten
27.3.3. Resultaten Scoring
27.4. Query Language
27.4.1. Terms
27.4.2. Fields
27.4.3. Term Modifiers
27.4.4. Proximity Searches
27.4.5. Boosting a Term
27.4.6. Boolean Operators
27.4.7. Grouping
27.4.8. Field Grouping
27.4.9. Escaping Special Characters
27.5. Query Types
27.5.1. Term Query
27.5.2. Multi-Term Query
27.5.3. Phrase Query
27.6. Karakterset.
27.6.1. Support voor UTF-8 en single-byte karaktersets.
27.7. Uitbreidbaarheid
27.7.1. Tekst analysator
27.7.2. Score Algorithmes
27.7.3. Opslag containers
27.8. Interoperatie met Java Lucene
27.8.1. Bestandsformaten
27.8.2. Index Map
27.8.3. Java Broncode
27.8.4. LuceneIndexCreation.jar gebruiken
27.9. Advanced
27.9.1. Using index as static property

27.1. Overzicht

27.1.1. Inleiding

Zend Search_Lucene is een algemene tekst search engine die volledig in PHP 5 is geschreven. Omdat het zijn indexbestanden op het bestandssysteem schrijft en geen database server nodig heeft, kan het zoekmogelijkheden aanbieden aan vrijwel elke door PHP gestuurde websites. Zend_Search_Lucene biedt de volgende mogelijkheden:

  • Geordend zoeken - betere resultaten eerst

  • Veel krachtige querytypes: ##VERT. phrase queries, wildcard queries, proximity queries, range queries## en meer [6]

  • Zoeken op een bepaald veld (bv: titel, auteur, inhoud)

Zend_Search_Lucene werd afgeleid van het Apache Lucene project. Voor meer informatie over Lucene kan je terecht op: http://lucene.apache.org/java/docs/.

27.1.2. Document en Veld Objecten

Zend_Search_Lucene beschouwt documenten als eenheden voor de indexering. Een document wordt dan opgedeeld in benoemde velden en velden hebben inhoud waarop kan gezocht worden.

Een document wordt voorgesteld als een Zend_Search_Lucene_Document object, en dit object bevat Zend_Search_Lucene_Field objecten die de velden voorstellen.

Belangrijk: eender welke informatie kan aan de index worden toegevoegd. Applicatie-specifieke informatie of metadata kan worden opgeslaan in de documentvelden en later worden opgevraagd met het document tijdens het zoeken.

Het is de verantwoordelijkheid van je applicatie om de indexer aan te sturen. Dit betekent dat data vanuit elke bron die toegankelijk is door je applicatie kan worden geindexeerd. Bijvoorbeeld de harde schijf, een database, een HTML formulier, etc.

De Zend_Search_Lucene_Field klasse bied verschillende statische methodes om velden met verschillende eigenschappen aan te maken:

<?php
$doc = new Zend_Search_Lucene_Document();

// Het veld worde niet tokenized, maar wordt geindexeerd en opgeslagen in de index
// Opgeslagen velden kunnen uit de index worden opgevraagd
$doc->addField(Zend_Search_Lucene_Field::Keyword('doctype', 
                                                 'autogenerated'));

// Veld wordt niet tokenized en niet geindexeerd, maar wordt wel in de index opgeslagen
$doc->addField(Zend_Search_Lucene_Field::UnIndexed('created', 
                                                   time()));

// Binaire string veld wordt niet tokenized en niet geindexeerd, 
// maar wordt wel in de index opgeslagen
$doc->addField(Zend_Search_Lucene_Field::Binary('icon', 
                                                $iconData));

// Veld is tokenized en geindexeerd, en opgeslagen in de index
$doc->addField(Zend_Search_Lucene_Field::Text('annotation', 
                                              'Document annotation text'));

// Veld is tokenized en geindexeerd, maar niet opgeslagen in de index
$doc->addField(Zend_Search_Lucene_Field::UnStored('contents', 
                                                  'My document content'));

?>

Je kan velden je eigen naam geven. Een "contents" veld naam wordt standaard tijdens het zoeken gebruikt. Het is een goed idee om de belangrijke informatie uit documenten in een veld met deze naam te plaatsen.

27.1.3. Veld Types Begrijpen

  • Keyword velden worden opgeslagen en geindexeerd, wat betekent dat ze doorzocht kunnen worden en ook in de zoekresultaten getoond kunnen worden. Ze worden niet opgesplitst in aparte woorden door 'tokenization'. 'Enumerated' database velden lenen zich over het algemeen goed voor Keyword velden in Zend_Search_Lucene.

  • UnIndexed velden zijn niet doorzoekbaar, maar worden wel teruggegeven bij zoek resultaten. Database timestamps, primaire sleutels, paden op het bestandssysteem en andere externe identifiers zijn goede kandidaten voor UnIndexed velden.

  • Binary velden worden niet tokenized of geindexeerd, maar worden wel opgeslagen om bij zoekresultaten te gebruiken. Ze kunnen gebruikt worden om data op te slaan als binaire string, zoals een icoontje.

  • Text velden worden opgeslagen, geindexeerd en tokenized. Tekst velden zijn zeer toepasselijk voor het opslaan van informatie zoals onderwerpen en titels die doorzoekbaar moeten zijn en ook bij de zoekresultaten beschikbaar moeten zijn.

  • UnStored velden worden tokenized en geindexeerd, maar niet opgeslagen in de index. Grote hoeveelheden tekst worden het best geindexeerd in dit type velden. Data opslaan zorgt voor een grotere index op de harde schijf, dus als je het moet doorzoeken maar niet hoeft weer te geven, kan je het beste een UnStored veld gebruiken. UnStored velden zijn praktisch wanneer ze worden gebruikt met een Zend_Search_Lucene index in combinatie met een relationele database. Je kan grote data velden met UnStored velden indexeren om te doorzoeken, en om ze yut de relationele database te halen met aparte velden als identifier.

    Tabel 27.1. Zend_Search_Lucene_Field Types

    Field Type Stored Indexed Tokenized Binary
    Keyword Ja Ja Nee Nee
    UnIndexed Ja Nee Nee Nee
    Binary Ja Nee Nee Ja
    Text Ja Ja Ja Nee
    UnStored Nee Ja Ja Nee


[6] Alleen term en multi-term queries worden op dit moment ondersteund.