Die indexed_search von TYPO3 ist auf der einen Seite mächtig, auf der anderen aber hat sie viele Probleme und Bugs. Ein Problem war immer die Geschwindigkeit. Grund genug für mich, eine neue Suche als Alternative zu indexed_search für TYPO3 zu programmieren.
Die Komplexität der indexed_search hat in den vergangenen Jahren immer mehr zu Problemen geführt. Ein großes Problem war die Geschwindigkeit der Suche. Zudem waren die Suchergebnisse nicht immer das, was man erwartet hätte. Mag sie auch aus Sicht eines Programmierers richtigen Algorithmen zu Grunde legen, so ist sie für den Otto-Normal-Sucher eher verwirrend. So ist nicht ersichtlich, wann der Index trotz korrekter Einstellung aktualisiert wird und was passiert mit Daten, die aus der Seite verschwunden sind? Gelöschte Seiten erscheinen trotzdem noch in den Suchergebnissen, was bei Kunden schon oft zu rechtlichen Problemen führte.
Kleinere Bugs runden die Problemchen der Suche ab: Fehlerhafte Ergebniszahlen bei steigender Seitenzahl, nicht funktionierender Footer-Link.
Nun machte ich mich an ein kleineres Projekt, das die indexed_search ersetzt und durch eine einfache und simple dafür aber um so effektive Alternative zu verwenden, die Website zu durchsuchen: no_indexed_search.
1. Speichern des gerenderten Contents in eine Tabelle
Ganz ohne das Speichern des Inhaltes in eine separate Tabelle kommt man nicht aus. Bei jedem Aufruf einer Seite wird der fertig gerenderte Inhalt der Seite mit weiteren Parametern (u.a. SeitenID, cHash, languageID) ohne die HTML-Tags in jene Tabelle abgespeichert. Damit kann die Suche immer auf den Inhalt selber zugreifen.
2. Verwendung des MySQL-indexes
Das Feld, in dem der Inhalt gespeichert wird, ist als Index-Feld definiert. Damit kann über eine einfache SQL-Anweisung eine Stichwortsuche über die ganze Tabelle möglich was eine erhebliche Beschleunigung ermöglicht.
Beispiel:
3. Einfache Konfiguration über Flexform
Um einem weiteren Problem der indexed_search, der komplexen Konfiguration über TypoScript, aus dem Weg zu gehen, wurden die meisten Einstellungen in das Flexform der EXT verlegt. Lediglich einige Grundeinstellungen wie die Einstellung zu Verwendung von Templa Voilà oder nicht sind im TS verankert.
-
Beispiel:
template = EXT:no_indexed_search/res/tx_noindexedsearch_template.html
result {
chars {
before = 100
after = 100
}
strftime = %d.%m.%Y
box {
wrap = <div>|</div>
titlewrap = <h2>|</h2>
}
}
_CSS_DEFAULT_STYLE (
.tx_noindexedsearch_pi2_highlight { background-color: yellow; }
)
}
4. Gruppierung der Suchergebnisse nach Seiten
Die Suchergebnisse können über das Flexform gruppiert werden. So werden z.B. Funstellen aus der Seite “Newsdetail” zuerst angezeigt, dann alle anderen Ergebnisse. Somit können bestimmte Bereiche in den Suchergebnissen bevorzugt werden.
Die EXT kann direkt auf hier von der Website geladen werden. no_indexed_search
Ein Beispiel für die Funktionalität kann auf meiner Testsite angeschaut werden. http://yaml.heissmann.org/home/suche.html
Ich bitte zu beachten, dass es sich hierbei um eine Beta mit Entwicklungstatus handelt.
- Bitte vor Gebrauch Daten sichern!!
- Für Fehler übernehme ich keine Haftung!






















Top Extension! Sucht, ist schnell, macht keine Kopfschmerzen.
Was die BE-Indizierung bei geänderten Seiten und Records betrifft: Gibt’s da schon was zum angucken?
Für die Doku fänd’ ich ansonsten erwähnenswert, dass und im (Seiten-)Template auftauchen müssen, das YATSE-Template und am besten auch result.chars.before & .after gesetzt werden müssen. Und eregi_replace statt ereg_replace wär’ super fürs Highlighten.
Aber wie gesagt: Hast Du vielleicht schon eine Entwicklerversion, was die Indizierung betrifft?
Hallo,
worauf muss ich achten beim installieren von YATSE? Ich habe die Extension installiert, das Template eingebunden, eine Suchseite mit Such-Inhaltselement erstellt und mir das Codebeispiel aus der Dokumentation ins Setup kopiert.
Aber irgendwie wird kein Index angelegt.
Ich bin TYPO3-Anfänger, deshalb weiß ich nicht weiter.
Was mache ich falsch?
[Code]
plugin.tx_yatse_pi1 {
template = EXT:yatse/res/tx_yatse_template.html
result {
chars {
before = 100
after = 100
}
strftime = %d.%m.%Y
box {
wrap = |
titlewrap = |
}
}
stats {
saveIP = 1
}
_CSS_DEFAULT_STYLE (
.tx_yatse_highlight { background-color: yellow; }
a.yatse_helplink div.yatse_helpbox { display:none; }
a.yatse_helplink:hover div.yatse_helpbox { display:block; position:absolute; width: 300px; margin-left: 10px;margin-top: -10px; padding: 4px; border: 1px solid black; background-color: white; font-size: 8pt; }
h4.yatse_helpheader { font-size: 10pt; margin-bottom: 6px; }
)
}
[/Code]
Hi Christoph,
kannst du mal das Debugging einschalten und schauen, was er für Fehler ausgibt. Ich vermute, dass hier ein SQL-Fehler vorliegt.
LG,
Mischa
Hat ein bisschen gedauert, aber jetzt habe ich mal den Debug-Modus aktiviert und folgendes kam dabei heraus, wenn ich was im Suchfeld eingegeben habe:
———-
caller t3lib_DB::sql_query
ERROR You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘ORDER BY data DESC’ at line 1
lastBuiltQuery SELECT *, MATCH (content) AGAINST (‘Internet’ IN BOOLEAN MODE) AS data FROM tx_yatse_content WHERE MATCH (content) AGAINST (‘Internet’ IN BOOLEAN MODE) AND page IN (2,63,101,62,4,41,36,37,35,94,11,17,97,106,108,107,21,18,19,20,23,24,25,110,58,59,92,100,102,12,15,99,98,80,82,27,6,13,14,7,10,86,95,89,81,87,61,83,96,-1) AND tx_yatse_content.deleted=0 AND tx_yatse_content.hidden=0 AND (tx_yatse_content.fe_group=” OR tx_yatse_content.fe_group IS NULL OR tx_yatse_content.fe_group=’0′ OR (tx_yatse_content.fe_group LIKE ‘%,0,%’ OR tx_yatse_content.fe_group LIKE ’0,%’ OR tx_yatse_content.fe_group LIKE ‘%,0′ OR tx_yatse_content.fe_group=’0′) OR (tx_yatse_content.fe_group LIKE ‘%,-1,%’ OR tx_yatse_content.fe_group LIKE ‘-1,%’ OR tx_yatse_content.fe_group LIKE ‘%,-1′ OR tx_yatse_content.fe_group=’-1′)) AND ll = ORDER BY data DESC
debug_backtrace require#76 // tslib_fe->INTincScript#461 // tslib_fe->INTincScript_process#3015 // tslib_cObj->USER#3089 // tslib_cObj->callUserFunction#724 // call_user_func_array#5866 // tx_yatse_pi1->main# // tx_yatse_pi1->makeResults#88 // t3lib_DB->sql_query#156 // t3lib_DB->debug#771
———-
Falls das ein zu großer Salat ist, hier nochmal als Bild:
http://pic.leech.it/pic.php?id=500dee1esqlerror.gif
Hoffe, das hilf weiter.
LG
Christoph
Gib mal in dein TypoScript-Template ein
config.language = de
Das ist bereits eingestellt.
Sag’ mal, was muss eigentlich beim “Ausgangspunkt” im Seitenelement eingestellt werden?
Funktioniert übrigens immer noch nicht.
Hast du vielleicht noch eine Idee?
LG
Christoph
Wie sieht es bei dieser Suche mit der Index-Anlagung aus?
Vermutlich muss doch eine Seite mindestens einmal aufgerufen worden sein, um in den Index zu kommen, oder?
Bei der “indexed_search” habe ich ja die Möglichkeit, durch die Crawler-Extension (“crawler”) automatisch zu indexieren. Da ich aber auch “tt_news” und Calendar Base (“cal”) nutze, bin ich nicht sicher, ob auch diese Inhalte indexiert werden.
Abgesehen davon kann ich mich mit der “indexed_search” nicht anfreunden, weil eine Suche auf einer Kundenseite, wo diese intgriert ist, über eine Minute dauert (Monatlich über 50 redaktionelle Artikel in “tt_news” und rund 600 Termine im Kalender “cal”).
Nun mal ab von all den Problemen:
Kann mir “YATSE” helfen, wenn ja, wie weit?
Hallo Christoph,
aaaaalso: Derzeit indexiert die Ext nur durch einen Aufruf der Seite, wie es die indexed_search macht. Ich bastle aber grade an einer Version, die automatisch indexiert, wenn im BE Änderungen an Datensätzen (Seite, tt_content oder eigene EXT) vorgenommen wurden. Damit wäre ein Crawler obsolet. Eine Initialindexierung kann aber dann nur über einen Seitenaufruf erfolgen.
Die Geschwindigkeit von YATSE ist derzeit weitaus schneller als die von der indexed_search weil ich die Indexierung der Datenbank direkt verwende, was eine wesentlich schnellere Suchabfrage ermöglicht.
Hallo Mischa,
das hört sich ja super an. Ich werde dann mal demnächst YATSE ausprobieren, zunächst auf meiner privaten Internetseite (da habe ich nämlich sowieso noch keine Suche, aber möchte ich gerne
) und wenn alles glattläuft, bekommt der Kunde auch die fixe Suche.
Danke für deine schnelle Antwort.
LG
Christoph
Auf deiner Seite scheint die Suche nicht wirklich zu funktionieren?
Hi Stefan,
Was geht denn genau nicht?
Na egal was ich eingebe.. Bekomme nie ein Ergebnis!
gut, das Problem könnte daran liegen, dass auf der Testsite kaum Informationen zu finden sind. Versuch doch mal so was wie “Lorem” oder “Beispiel”. Man kann auch nach Wortteilen suchen. Hierzu ist der Asterisk * zu verwenden. (Bei*)
Ah ok funktioniert.. Aber wenn ich oben rechts auf die Seite “Suche” gehe funktioniert es nicht mehr
Naja gut, die Suche oben rechts ist auch die indexed_search.
Die geht wirklich nicht.