Login
Newsletter
Werbung

Do, 13. Oktober 2016, 15:01

FTS – Volltextsuche mit SQLite

Die relationale Datenbank SQLite wird aufgrund des »Lite« im Namen in Sachen Funktionsumfang gerne unterschätzt. Zu einer der weniger bekannten, aber recht praktischen Funktionalitäten gehört die Möglichkeit der Volltextsuche mit SQLite. Diese wird hier im Artikel vorgestellt.

Redaktioneller Hinweis: Dieser Artikel wurde auf Basis von SQLite 3.11.0 geschrieben, wobei die Befehle auch unter anderen SQLite3-Versionen funktionieren sollten. Der SQLite-Prompt in diesem Artikel ist »sqlite>« und muss nicht mit eingegeben werden.

Die Volltextsuche in SQLite wird über die virtuellen Tabellenmodule namens »FTS« realisiert, wobei FTS einfach für »full text search« steht. Es gibt in der Tat drei verschiedene Implementierungen: FTS3, FTS4 und FTS5. Der Hauptunterschied liegt dabei »im Hintergrund«, also wie SQLite die Daten intern strukturiert. Die hier gezeigten Beispiele funktionieren mit allen drei Implementierungen. Wer sich im Detail für die Unterschiede interessiert, kann diese zwischen FTS3 und 4 in der SQLite-Dokumentation nachlesen und die zwischen FTS3/4 und 5 in einem Blogbeitrag.

FTS3, 4 und 5 sind im Quellcode von SQLite standardmäßig enthalten, müssen aber nicht zwingend mit einkompiliert sein. Bei der in den Paketquellen von Ubuntu 16.04 enthaltenen Version 3.11.0 von SQLite3 ist z.B. FTS3 und FTS4 enthalten.

Ob das FTS-Modul verfügbar ist, lässt sich einfach testen: man öffnet die SQLite-Shell und führt folgenden SQL-Befehl aus:

sqlite> CREATE VIRTUAL TABLE data using fts3();

Erscheint direkt wieder der Prompt, dann ist FTS3 (und auch 4) verfügbar. Erscheint eine Fehlermeldung, ist FTS nicht enthalten und man muss sich SQLite selber kompilieren. FTS3 und 4 sind nicht getrennt, beim Kompilieren werden immer beide Module erstellt.

Was machen die FTS-Module eigentlich?

Wie oben bereits erwähnt wird die Volltextsuche über virtuelle Tabellen, die FTS-Tabellen, realisiert. Vereinfacht gesagt »zerlegt« SQLite den Text dabei in einzelne Worte (im SQLite Kontext »Tokens« genannt) und indiziert diese. Dadurch ist die Suche nach einem oder mehreren Worten im indizierten Text erheblich schneller und effizienter als eine »klassische« Suche mit »LIKE«, weil nicht jeder einzelne Datensatz komplett durchlaufen werden muss.

In der Dokumentation von SQLite wird ein Beispiel einer Abfrage mit einer sehr großen Textmenge aufgeführt, bei der die Suche nach einem Wort mit FTS3 um den Faktor 750 (!) schneller ist eine Suche mit »LIKE«.

Pro-Linux
Pro-Linux @Facebook
Neue Nachrichten
Werbung