Ich hole mal etwas weiter aus, damit ihr versteht, was die 8.1 anders macht als frühere Versionen, und wo die Vorteile - aber auch Herausforderungen - liegen.
Zunächst muss man verstehen, wie die Suche in SQL-Datenbanken geschieht. Nämlich über den LIKE-Operator in Verbindung mit dem %-Zeichen als Wildcard
Beispiel: Diese Anfrage findet alle Elemente, deren Titel mit “Yesterday” beginnt.
SELECT * FROM items WHERE title LIKE 'Yesterday%';
Wohingegen diese Anfrage alle Elemente findet, die “Yesterday” irgendwo im Titel haben:
SELECT * FROM items WHERE title LIKE '%Yesterday%';
(Das % ist quasi das *, das ihr aus Dateisystemen kennt.)
Technisch gibt es einen riesengroßen Unterschied zwischen diesen beiden Anfragen. Denn die wichtigen Spalten sind in der mAirListDB alle indiziert, das heißt, die Datenbank pflegt einen alphabetischen Index, welche Datensätze welchen Wert enthalten.
Der ganz sehr effizient eingesetzt werden, wenn man entweder nach dem genauen Begriff sucht (title='Yesterday Man') oder nach Datensätzen, bei denen der Begriff am Anfang steht (title LIKE 'Yesterday%'). Da muss die Datenbank nämlich einfach nur im Suchindex bei Y nachschlagen, um es vereinfacht auszudrücken.
Sucht man hingegen mit LIKE '%Yesterday%' - also mit dem Suchstring an einer beliebigen Stelle innerhalb des Feldes - dann muss die Datenbank tatsächlich alle Datensätze einzeln durchgehen und den Inhalt des jeweiligen Feldes durchsuchen, was bei 250k Datensätzen durchaus dauern kann.
Bis mAirList 8.0 gab es im Dropdown-Menü, in dem man auch die zu durchsuchenden Felder auswählen kann, daher einen Haken Volltextsuche, um dieses Verhalten ein- oder auszuschalten.
Darüber hinaus gab es noch einen zweiten Haken Erweiterte Suche. Wenn dieser aktiviert war, wurden Suchanfragen, die aus mehr als einem Wort bestehen, intern zunächst getrennt gesucht, und dann die Schnittmenge der Ergebnisse zurückgeliefert. So konnte man z.B. nach Titel und Interpret gleichzeitig suchen.
Solange man sich in klassischen SQL-Datenbanken bewegt, kommt man aus diesem Korsett nicht heraus: Entweder sucht man nur (schnell) nach Begriffen am Anfang der Felder, oder man sucht (langsam) nach Begriffen, die auch in der Mitte von Feldern stehen können.
Das steht leider etwas im Widerspruch zu dem, was wir Nutzer heutzutage erwarten und von Suchmaschinen wie Google gewohnt sind: Man gibt einen Haufen Begriffe ein, und erhält sehr schnell genau die Treffer, die zu diesen Begriffen passen.
Das funktioniert bei Google aber nur deshalb, weil die einen Volltext-Index für die Suchergebnisse erstellen, also quasi jede Webseite in ihre einzelnen Wörter zerlegen, und diese in einer effiziet zu durchsuchenden Tabelle speichern.
Der SQL-Standard sieht soetwas nicht vor. Gleichwohl existiert das mittlerweile bei manchen SQL-Typen als proprietäre Erweiterung. Und genau solch eine, nämlich die von PostgreSQL, unterstützt mAirList 8.1 nun: PostgreSQL: Documentation: 18: Chapter 12. Full Text Search
Aus Entwicklersicht ist das sehr komfortabel, denn man muss nur einmal die entsprechenden Indexe anlegen (und die Trigger, die den Index bei Änderungen an Elementen automatisch aktualisieren), und danach kann man die Suchanfrage einfach so in die Datenbank werfen, und kriegt sehr schnell die passenden Ergebnisse zurück.
Andere Datenbanken können sowas zum Tel auch, da muss ich aber noch schauen, inwieweit das für unsere Zwecke geeignet ist.
Was passiert nun, wenn man kein PostgreSQL mit aktiviertem FTS benutzt? Dafür sind die beiden anderen Modi da, die so ähnlich arbeiten wie mAirList 8.0 - verglichen mit dessen alten Checkboxen:
- deaktiviert: sucht in allen Feldern, dabei: “erweiterte Suche” eingeschaltet, “Volltextsuche” ausgeschaltet
- deaktiviert: sucht in allen Feldern, dabei: “erweiterte Suche” eingeschaltet, “Volltextsuche” eingeschaltet
Ich hatte gehofft, dass diese beiden Auswahlmöglichkeiten ausreichen, um die echte Volltextsuche nachzubilden. Entnehme aber euren Rückmeldungen, dass eventuell noch Finetuning-Optionen notwendig sind, insbesondere bei sehr großen Datenbeständen.
Was ich mich frage: Ist es überhaupt notwendig, dass bei der einfachen Suche mehr Felder durchsucht werden also Interpret und Titel (und ggf. Datenbank-ID und Externe ID)? Könnte man sich auf den Standpunkt zurückziehen, wer in Attributen oder nach bestimmten Titellängen suchen möchte, möge die erweiterte Suche verwenden? Das würde schonmal alles etwas beschleunigen, denke ich.
Und um das hier noch aufzuklären:
Im Modus “deaktiviert” werden nur Datensätze gefunden, bei denen der Suchbegriff am Anfang des Feldes steht. Dennoch werden die einzelnen Wörter der Suche nach Leerzeichen getrennt und separat gesucht.
Suchst du also zum Beispiel nach “Yesterday Man”, dann findet er nichts, weil das “Man” nicht am Anfang des Titelfeldes steht.
Als mögliche Lösung könnte man der Datenbank sagen, finde auch Einträge, bei denen der gesamte Suchbegriff (incl. Leerzeichen) am Anfang des Feldes steht. Dann würde er “Yesterday Man” finden.
Schwieriger wird es, wenn du drei Wörter eingibst, da dann nicht sofort klar ist, welche Teilmengen jetzt zueinander gehören.
Hinweis an der Stelle: Die Möglichkeit, mit Anführungszeichen zu arbeiten, kommt im nächsten Snapshot.