Indizierung

Geschätzte Lektüre: 4 Minuten

Oft möchte man in potentiell großen Dokumenten bzw. Dateninhalten nach bestimmten Wörtern oder einem Satz suchen. Da ein normales durchforsten des ganzen Textes mit der Größe/Anzahl der Texte immer langsamer wird, können die Texte bei aktivierter Indizierung vorab in eine durchsuch-freundliche Form gebracht werden. Diese Berechnung kann z.B. jede Nacht ausgeführt werden um am folgenden Tag einen erheblichen Geschwindigkeitsvorteil bei der Suche zu erzielen.

Aktivierung

Eine Indizierung ist nur bei Dokumenten und Long-Feldern möglich. Bei einem Long-Feld muss zusätzlich in der Tabelle die Option „Verschlagwortung“ aktiviert sein. Eine einmalige oder auch periodische Ausführung kann in den System-Jobs gestartet werden.

Funktionsweise

Konvertierung in Text

Aus Dateien wird zunächst Text extrahiert. Für Pdf-Dateien wird dabei das Tool pdftotext benutzt. Für Text-Dateien wird bei aktivierter Umgebungsvariable use_html2text das Tool html2text verwendet. Für sonstige Dateien kann optional das Tool Apache Tika verwendet werden. Dazu muss in den Umgebungsvariablen indize_tika aktiviert sein, Java installiert sein und die Datei /opt/tika/tika.jar existieren.

Limbas-Indizierung

Aus dem resultierenden Text wird jedes Wort einmalig in die Tabelle lmb_indize_w eingefügt. Stammt das Wort aus einer Datei, wird dieser Zusammenhang in der Tabele lmb_indize_fs gespeichert. Wird hingegen gerade ein Long-Feld indiziert, wird das Wort in der Tabelle lmb_indize_ds mit dem entsprechenden Datensatz verknüpft.

Sucht man nun nach einem Wort, kann über die Tabellen leicht herausgefunden werden wo es vorkommt.

Postgres-Indizierung

Inzwischen bieten viele Datenbanken eine Indizierung selbst an. Diese sind meistens gut optimiert sodass die volle Performance der Datenbank genutzt werden kann. Außerdem wird so zusätzliche Funktionalität unterstützt, wie bspw. das Suchen nach einem ganzen Satz. In Limbas wurde die Indizierung der PostgreSQL-Datenbank bereits integriert.

Indizierung

In den Umgebungsvariablen kann die Postgres-Indizierung konfiguriert werden. Um die Postgres-Indizierung zu aktivieren (und die Limbas-Indizierung zu deaktivieren) muss die Option postgres_use_fulltextsearch gesetzt sein.

Um den Suchaufwand gering zu halten, werden Texte hierbei in eine alternative Form heruntergebrochen. Hierbei werden bspw. Stoppwörter entfernt oder Nomen auf ihren Wortstamm reduziert. Außerdem wird die Position der Wörter mitgespeichert. Der Satz „Die Maus ist im Hause“ wird hierbei zu „‚haus‘:5 ‚maus‘:2“. Dieses Verfahren ist abhängig von der Sprache des Textes, welche bei postgres_indize_lang eingestellt werden kann. Sind alle Texte in der gleichen Sprache, kann diese direkt eingetragen werden (z.B. „german“). Soll die Datenbank selbst entscheiden um welche Sprache es sich handelt, können entweder mehrere Sprachen (z.B. „german,english,french“) oder „all“ (für alle unterstützten Sprachen) eingetragen werden. Je mehr Sprachen angegeben werden, desto länger dauert die Indizierung.

Das Speichern der Wort-Positionen ist wichtig, wenn nach einem ganzen Satz gesucht werden soll, braucht aber auch mehr Speicherplatz in der Datenbank. Möchte man eh nur nach Wörtern suchen, kann das Speichern der Positionen mit der Option postgres_strip_tsvector verhindert werden.

Such-Performance

Ist die Suche zu langsam, kann sie mit einem Datenbank-Index beschleunigt werden.

Für Dateien:

CREATE INDEX <index-name> ON LDMS_FILES USING GIN (FTS_VECTOR);

Für Long-Felder:

CREATE INDEX <index-name> ON <table-name> USING GIN (<field-name>_FTS_VECTOR);

Ergebnis

Wenn man in mehreren Datensätzen sucht, kann das Ergebnis danach sortiert werden, wie gut die gefundenen Datensätze zur Such-Anfrage passen indem man die Einstellung postgres_rank_func auf „TS_RANK“ oder „TS_RANK_CD“ setzt. Der Unterschied ist in der Postgres-Doku beschrieben und wird hier nicht weiter erläutert. Die Einstellung kann frei gelassen werden um das Ergebnis nicht zu sortieren und die Abfrage somit zu beschleunigen.

Wurde der Suchbegriff gefunden, möchte man einen Ausschnitt des Textes um den gefundenen Begriff herum sehen. Bei aktivierter Option postgres_headline erhält man hierbei unter Geschwindigkeitsverlust bessere Ergebnisse.

Share this Doc

Indizierung

Or copy link

CONTENTS