Letzte Woche fand sich im Symfony Blog (
A week of symfony #34 (20->26 August 2007)) die Ankündigung eines meiner Meinung nach sehr coolen Plugins - dem
sfPropelZSLSearchPlugin: Es integriert die
PHP Portierung von
Apaches Lucene aus dem
Zend Framework in Symfony. Ich habe früher schon mit dem Gedanken gespielt, Zends Lucene Implementierung für diginights einzusetzen, was allerdings aus mangelnder Zeit und der höhreren Priorisierung anderer Tasks niemals passiert ist.
Für alle, die es nicht wissen: Lucene ist ein index-basiertes Suchsystem welches das schnelle Durchsuchen von Dokumenten/Webseiten ermöglicht. Eine Suchanfrage durchsucht also nicht in Echtzeit jede einzelne Webseite, sondern nur den bereits erwähnten Index, der in einem anderen Schritt (automatisiert) erstellt wird.
Das geniale an dem Plugin ist, dass die Integration (fast) komplett über Konfigurationsdateien erfolgt, zudem wird das Symfony CLI um einige Tasks erweitert, die beispielsweise den Index optimieren oder komplett neu erzeugen. Die Optimierung sollte wohl hin und wieder mal ausgeführt werden, da Lucene intern mit mehreren Indices arbeitet die dadurch verschmolzen werden. Zudem ist das Handling von i18n-Tabellen bereits komplett abgebildet.
Bei dynamischem Content (welcher i.d.R. durch Propel Objekte abgebildet wird) wird dem entsprechenden Propel Objekt ein spezielles Verhalten hinzugefügt, welches nach Aufruf von save() automatisch den Index aktualisiert.
class ForumPost extends BaseForumPost {}
sfPZSLBehavior::getInitializer()->setupModel('ForumPost');
Aus welchen Daten der Index aufbereitet werden soll, wird in der
project/config/search.yml definiert - zu beachten gilt es, dass zu den Feldnamen die entsprechenden Getter definiert sind (hier ForumPost::getTitle(), ForumPost::getContent(), ForumPost::getStrippedTitle()):
models:
ForumPost:
fields:
title:
boost: 1.5
type: text
content: unstored
strippedtitle: unindexed
index:
name: MyIndex
encoding: UTF-8
cultures: [de_DE]
Die korrekte Verlinkung der entsprechenden Trefferseiten einer Suchanfrage geschieht durch festlegen der einzelnen Routen sämtlicher beteiligter Propel Klassen in der
application/config/search.yml:
models:
ForumPost:
route: "@forum_thread?stripped_title={$strippedtitle}"
In diesem Beispiel wird {$strippedtitle} durch den Wert, der im Index gespeichert wird ersetzt.
Dafür, dass es sich noch um eine Alpha Version handelt, die erst zwei Releases hatte muss ich sagen, dass ich von der Codequalität und der Umsetzung total überzeugt bin - ganz im Gegensatz zu anderen Plugins wie beispielsweise dem
sfSimpleForumPlugin.
Für mehr Informationen und Screenshots lohnt ein Vorbeisurfen auf der
Wiki Seite des Plugins.