Neue Suche auf Basis von Lucene?
Verfasst: Do 31. Jul 2014, 11:37
Die alte Suchbibliothek wurde zwar bereits für LEPTON überarbeitet und dann so in BC übernommen, aber so richtig prickelnd ist das immer noch nicht. Zumal es auch nicht besonders gut dokumentiert ist. Schon der Gedanke daran, die Suchbibliothek zu überarbeiten, dreht mir die Zehennägel um.
Ich habe mich mal nach Alternativen umgesehen und bin bei ZendSearch_Lucene gelandet. Lucene ist eigentlich eine in / für Java entwickelte, indexbasierte Suche, für die es im Zend-Framework einen in PHP geschriebenen Port gibt.
Der Hauptunterschied zwischen einer Livesuche (wie in unserer lib_search) und einer indexbasierten Suche besteht darin, dass die Live-Suche zum Zeitpunkt der Suchanfrage den gesamten Volltext durchsucht, während die Indexsuche nur den eigenen Index durchforstet. Daher ist die Indexsuche in der Regel deutlich schneller als die Live-Suche. Der Haken: Der Index muß ja auch irgendwann mal erzeugt und aktuell gehalten werden.
Im Fall von BC wäre der richtige Zeitpunkt zum Erzeugen bzw. Aktualisieren des Index derjenige, wenn im Backend Änderungen stattfinden. Die derzeitigen Schnittstellen sind dafür allerdings nicht ausgerichtet. Eine Änderung im Core wäre natürlich möglich, bedingt allerdings eine relative enge Integration der Suchmaschine.
Ein Zwischenschritt könnte sein, die Indexsuche so zu integrieren, daß der Index in einem konfigurierbaren Abstand - z.B. einmal am Tag, einmal pro Stunde - neu erzeugt bzw. aktualisiert wird. Entweder bei Ausführung einer Suche durch einen Besucher, oder per Cronjob. Letzteres hätte den Vorteil, daß der Besucher, den es zufällig trifft, nicht so lange warten muß.
Der Nachteil der Variante ist selbstverständlich, daß man auch in einer Stunde ziemlich viele Änderungen machen kann, die dann zunächst nicht im Index stehen. Einem Button [Index aktualisieren] im Backend würde allerdings auch nichts im Wege stehen.
Ich habe leider keine Erfahrungen mit der Performance, weder der aktuellen Implementierung, noch der Index-Erzeugung. Die derzeitige Live-Suche ist intern so gestrickt, daß sie mit Timeouts arbeitet. Braucht ein Modul zu lange für die Ausführung der Suche, wird sie abgebrochen. Was natürlich im Umkehrschluß bedeutet, daß die Suchergebnisse unvollständig sind. Das wirkt sich allerdings hauptsächlich bei umfangreichen Webauftritten aus.

Ich habe mich mal nach Alternativen umgesehen und bin bei ZendSearch_Lucene gelandet. Lucene ist eigentlich eine in / für Java entwickelte, indexbasierte Suche, für die es im Zend-Framework einen in PHP geschriebenen Port gibt.
Der Hauptunterschied zwischen einer Livesuche (wie in unserer lib_search) und einer indexbasierten Suche besteht darin, dass die Live-Suche zum Zeitpunkt der Suchanfrage den gesamten Volltext durchsucht, während die Indexsuche nur den eigenen Index durchforstet. Daher ist die Indexsuche in der Regel deutlich schneller als die Live-Suche. Der Haken: Der Index muß ja auch irgendwann mal erzeugt und aktuell gehalten werden.
Im Fall von BC wäre der richtige Zeitpunkt zum Erzeugen bzw. Aktualisieren des Index derjenige, wenn im Backend Änderungen stattfinden. Die derzeitigen Schnittstellen sind dafür allerdings nicht ausgerichtet. Eine Änderung im Core wäre natürlich möglich, bedingt allerdings eine relative enge Integration der Suchmaschine.
Ein Zwischenschritt könnte sein, die Indexsuche so zu integrieren, daß der Index in einem konfigurierbaren Abstand - z.B. einmal am Tag, einmal pro Stunde - neu erzeugt bzw. aktualisiert wird. Entweder bei Ausführung einer Suche durch einen Besucher, oder per Cronjob. Letzteres hätte den Vorteil, daß der Besucher, den es zufällig trifft, nicht so lange warten muß.

Ich habe leider keine Erfahrungen mit der Performance, weder der aktuellen Implementierung, noch der Index-Erzeugung. Die derzeitige Live-Suche ist intern so gestrickt, daß sie mit Timeouts arbeitet. Braucht ein Modul zu lange für die Ausführung der Suche, wird sie abgebrochen. Was natürlich im Umkehrschluß bedeutet, daß die Suchergebnisse unvollständig sind. Das wirkt sich allerdings hauptsächlich bei umfangreichen Webauftritten aus.