Verschiedene Möglichkeiten, einen Lucene-Suchindex via PHP einzubinden

Lucene – Ein Suchindex in der Praxis
Kommentare

Beispiel 1: PHP-Java-Bridge

YES;
$FI=java(‚org.apache.lucene.document.Field$Index‘)->ANALYZED;

$doc = new Java(‚org.apache.lucene.document.Document‘);

$field = new Java(‚org.apache.lucene.document.Field‘,’Autor‘,’Manfred

Beispiel 1: PHP-Java-Bridge
YES;
$FI=java('org.apache.lucene.document.Field$Index')->ANALYZED;

$doc = new Java('org.apache.lucene.document.Document');

$field = new Java('org.apache.lucene.document.Field','Autor','Manfred Hardt', $FS, $FI);
$doc->add($field);  
$field = new Java('org.apache.lucene.document.Field','Titel','Suchmaschinen entwickeln mit Apache Lucene', $FS, $FI);
$doc->add($field);

$writer->addDocument($doc);
            

$writer->optimize();
$writer->close();

#---- Abfrage über alle Felder ----

$indexer = new Java('org.apache.lucene.search.IndexSearcher',$index_dir);

# Lese alle indizierten Felder aus dem Index aus
$Felder_ind = java('org.apache.lucene.index.IndexReader$FieldOption')->INDEXED;
$IndexReader = java('org.apache.lucene.index.IndexReader')->open($index_dir);
$AlleSuchfelder=java_values($IndexReader->getFieldNames($Felder_ind)->toArray());
$IndexReader->close();

# Eine Suche über alle im Index vorhandenen Suchfelder
$parser = new Java('org.apache.lucene.queryParser.MultiFieldQueryParser', $AlleSuchfelder,$analyzer);

$query = $parser->parse('Apache');  // Sucht nach 'Titel:Apache' OR 'Autor:Apache'

$hits = $indexer->search($query);

$num=java_values($hits->length());

printf("3) Hits: %dn", $num);

for ($i = 0; $i doc($i);
printf("Fount %s n", $i.": ".$found->get('Titel'));
}
?>

In dem Beispiel wird ein Buchdatensatz in den Index aufgenommen und wieder gesucht. Sehr deutlich ist bei der Programmierung die Nähe zu Java zu erkennen.

Zend-Framework – Bereich Lucene-Suche

Das Zend-Framework ist eine von vielen Routinen-Sammlungen im Bereich von PHP, aber der Name „Zend“ bürgt hier für eine gute Qualität. Die Entwickler von Zend haben die Routinen von Lucene in einen 100-prozentigen PHP-Code portiert und ganz im Stil von PHP vereinfacht – getreu dem Motto: „Keep it simple“. Wer nicht das gesamte Framework installieren will, kann auch die Lucene– und Exception-Ordner herauskopieren. Beschränken wir den Blick nur auf den Lucene-Teil, so beruht die Lauffähigkeit auf vier weiteren Komponentenabhängigkeiten, die bei Windows entweder in der php.ini als DLL eingebunden werden oder bei Unix-Systemen beim Übersetzen des PHP-Sourcecodes mit einkompiliert werden müssen: Als Abhängigkeiten sind hier bitset, dom, icon und ctype zu nennen. Letzteres ist inzwischen in PHP enthalten. Bitset ist eine Extension, die auch noch zur Laufzeit hinzu geladen werden kann.

Die Installation des eigentlichen Frameworks ist vergleichsweise einfach – man kopiert den Ordner Zend in den Include-Bereich von PHP oder legt zur Laufzeit den Ort fest. Egal wie – wichtig ist, dass PHP die Dateien bei einem include() oder require() findet. Der Vorteil dieses Wegs ist, dass die Lösung komplett in PHP geschrieben ist und somit auch PHP-Cache-Projekte einen Geschwindigkeitsvorteil bringen. Zend stellt eine sehr gute deutschsprachige Übersetzug der Dokumentation zur Verfügung, die auch mit reichlich Programmbeispielen aufwartet, wodurch einem der Einstieg in die Materie sehr leicht fällt. Ferner bietet Zend auch in diesem Bereich Routinen an, um MS-Powerpoint-, Excel- oder Word-Dokumente einzulesen. Als kleiner Nachteil sind die Abhängigkeiten von anderen Programmpaketen und die Tatsache, dass es sich lediglich um eine Portierung des Lucene-Java-Codes handelt, zu nennen.

Beispiel 2: Zend-Framework
addField(Zend_Search_Lucene_Field::Text('Autor', 'Manfred Hardt','ISO-8859-1'));
$doc->addField(Zend_Search_Lucene_Field::Text('Titel', 'Suchmaschinen entwickeln mit Apache Lucene','ISO-8859-1'));

$index->addDocument($doc);

$index->commit();
$index->optimize();

#---- Abfrage ----

$index = Zend_Search_Lucene::open($index_dir);

try {
        $query = Zend_Search_Lucene_Search_QueryParser::parse('Titel:Lucene','ISO-8859-1');
} catch (Zend_Search_Lucene_Search_QueryParserException $e) {
        echo "Query syntax error: " . $e->getMessage() . "n";
}

$count=0;
$hits = $index->find($query);

echo "Index enthält ".$index->count()." Dokumente.nn";

foreach ($hits as $hit)
{
        $document = $hit->getDocument();
        printf("Fount %d %s %s n", $count++,$document->getFieldValue('Autor'),$document->getFieldValue('Titel'));
        # oder printf("Fount %d %s %s n", $count++,$hit->Autor, $hit->Titel);
}

?>

Das Zend-Beispiel ist deutlich intuitiver und die Programmierung ist auch mehr PHP-like.

CLucene mit PHP-Extension

CLucene ist eine Portierung des Lucene-Java-Quellcodes in die Programmiersprache C++, wodurch man einen hochperformanten Programmcode zum Zugriff auf den Index bekommt. Die Anbindung an PHP erfolgt über eine Extension. Im Gegensatz zu den ersten beiden Möglichkeiten ist diese jedoch nur eingeschränkt nutzbar, da nur die SearchIndex– und Hit-Klasse von der Extension zur Verfügung gestellt wird. Man kann also mit der Erweiterung nur einen Index aus PHP heraus abfragen, nicht aber einen aufbauen oder manipulieren. Der als alpha gekennzeichnete Programmcode für die Erweiterung scheint auch nicht mehr gepflegt zu werden, worauf das letzte Änderungsdatum von 2005 hindeutet.

Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -