Ein Extraposting, welches auf dem Fuße folgt
Teil 2 unserer Testserie - die Suchen-Funktion
Das war ja eines meiner Hauptanliegen, mit dem ich dich damals angesprochen habe. Nochmals herzlichen Dank dafür, daß du das mit implementiert hast, auch von Seiten meiner Freundinnen!
Mit ihnen habe ich diese neue Suchen-Funktion intensiv getestet. Wir pflegen in einem gemeinsamen Projekt derzeit 187 Seiten, deren Seiten alphabetisch abgelegt und dazu in diversen Kategorien eingeordnet sind. Diese werden an einer ganz anderen Stelle im Projekt zu ausgiebigen Listen zusammengestellt, immer den Inhalten eines bestimmten Feldes nach geordnet (welches nicht das content_en-Feld ist).
Dabei fiel uns auf, daß sich die Suchenfunktion anders verhält, als wir das erwartet haben
Ein Suchbegriff, der aus zwei verschiedenen Worten besteht, ist ein "sowohl als auch" anstatt ein "nur dieser feststehende Begriff aus diesen Worten und sonst nichts". Zudem findet er auch Teilmengen, was nicht beabsichtigt war. Geben wir etwa den Suchbegriff "Wasser" ein, findet er auch "Süßwasser", "Brackwasser" oder "Salzwasser". Er soll aber nur und ausschließlich den Begriff "Wasser" finden.
Ordnungskategorien haben wir Unmengen, dazu ziemlich exotische Suchbegriffe, von denen ich hier mal als Beispiel einige aufliste. Sozusagen eine Art Härtetest

In der Kategorie "Erscheinungsform" finden sich diese feststehenden Suchbegriffe:
Code: Select all
- Gestaltwandler
- humanoid/ohne Angabe
- humanoid/veränderlich
- humanoid/winzig
- humanoid/sehr klein
- humanoid < 10 cm
- humanoid < 30 cm
- humanoid/klein
- humanoid < 50 cm
- humanoid < 1 m
- humanoid < 1,50 m
- humanoid/menschengroß
- humanoid < Mensch
- nicht humanoid
Da ist schnell klar, wo das Problem liegt: Nach welchem Begriff, der nur ein einziges Mal vorkommt, soll man suchen lassen? Zumal es offenbar auch noch eine Begrenzung gibt: Wenn der Suchbegriff aus weniger als 2 oder 3 Zeichen besteht, wird gar nichts gefunden (vielleicht, weil gar nicht erst gesucht?). Bestimmt eine sinnvolle Sicherheitsabfrage, aber hier leider nicht die Lösung. Wir können nicht nach "10" oder "10 cm" suchen, nicht nach "1,50 m", nicht nach "cm" - sehr schade, das.
Bei "sehr klein" mußten wir uns mit "klein +sehr" behelfen. Der Suchbegriff "sehr +klein" gab hingegen alle Datensätze aus, in denen das Wort "sehr" UND das Wort "klein" vorkam, also auch alle Daten aus der Kategorie "humanoid/klein". Von der Verwendung eher arg gewöhnungsbedürftig, weil man vom analogen Standpunkt aus nach "sehr klein" als festem Suchbegriff suchen würde. Was also fehlt, ist die Funktionalität von "Suchbegriff als Ganzes auswerten". Wie bei Google, wenn die Anführungszeichen mit im Suchbegriff verwendet werden. Das wäre überaus hilfreich und eine tolle Erweiterung. Dann klappt's auch mit den Humanoiden
Dann fiel noch auf:
Standardmäßig sucht das Script immer im Feld content_en, was in diesem Fall nicht gewünscht ist und möglicherweise unnötig Rechenleistung kostet. Die Kategorien mit den auszuwertenden Suchbegriffen stehen in unserem Falle alle in Extrafeldern. Und es werden auch nur die Inhalte der Extrafelder benötigt, nicht der content_en-Inhalt.
Darüberhinaus kann man eine Suche und eine Abfrage von Extrafeldern nicht kombinieren. Die Aufgabe war bei uns: Suche nach einem bestimmten Suchbegriff (bestehend aus mehreren Worten, die genau so und nicht anders sein sollen, also auch keine Teilmengen) im Extrafeld "Kategorien" und hole für die gefundenen Datensätze die Inhalte aus den (Extra-)Feldern "Kategorien", "Klassifizierung" und "Kurzbeschreibung". Baue daraus dann eine Liste.
Das klappte in der Praxis auf Anhieb leider so gar nicht. Man kann entweder (in einem Feld via block_name="NameDesFeldes") suchen oder nur Inhalte zusammenstellen. Ich mußte einen Umweg wählen, um an die gewünschten Inhalte ranzukommen: Erst in einem ersten Durchlauf alle Datensätze sammeln, die den gewünschten Suchbegriff enthielten und dann einen zweiten content_dump starten, in dem die ermittelte content_id als $this_only-Parameter übergeben wurde. Erst dann erhielt ich die Inhalte, die ich brauchen konnte für meine Ausgabeschleife. Die sieht jetzt so aus:
Code: Select all
{content_dump block_name=$suchfeld filter=$suchwort start_id="82" exclude="82" depth="-1,2" prefix="buchstabe_" prefix_mode="hide" first_sort="title" html="strip"}
<ul class="kreaturenliste">
{foreach from=$dump item=dump}
{content_dump extensions="klassifizierung,kurzbeschreibung" this_only=$dump->content->id html="strip"}
{foreach from=$dump item=dump}
<li><span class="klassifizierung">
{$dump->extensions->klassifizierung->data}</span>
<b>{cms_selflink page=$dump->content->alias text=$dump->content->title}</b>
{if $dump->extensions->kurzbeschreibung->data != ''}
<span class="klein"> {$dump->extensions->kurzbeschreibung->data}</span>
{/if}
</li>
{/foreach}
{/foreach}
</ul>
$suchfeld und $suchbegriff werden dabei von der aufrufenden Seite als smarty-Variablen gesetzt, bevor der eigentliche Aufruf startet, der seinerseits in dem global-content-block liegt.
Der Effekt: Er läuft die 187 Datensätze beinahe doppelt durch - es kommen in dieser Variante 277 Datenbankabfragen zustande. Zum Glück auf unserem Liveserver recht schnell (bei mir zuhause auf einer XP-Maschine mit XAMPP ziemlich langsam), aber ich frage mich, ob diese Vorgehensweise erstrebenswert ist? Wir generieren damit doch eine arge Datenbanklast, richtig?
Und noch eine Idee zum Schluß (und dann ist auch Schluß für heute): Wäre es möglich, die Abfrage so zu erweitern, daß auch der Menü-Title mit übergeben wird? Falls man mal auf diesen zurückgreifen wollte und nicht auf den Title der Seite. Das wäre eine klasse Erweiterung
Okay, also nochmals vielen lieben Dank für deine Mühe und dein enormes Engagement. Ich hoffe, wir konnten dir damit einen Gefallen tun. Wie gesagt, die "Whole Word only"-Funktion in der Suche wäre noch dringend erforderlich, um dein wunderbares Werk abzurunden (und unsere absonderlichen Wesen ans Tageslicht zu befördern, die derzeit noch in den Weiten der Datenbank verschollen bleiben) und einen Rat zur .htaccess würde ich noch erbitten.
Herzlichen Dank und liebe Grüsse
Amendra