Firebird: Volltextindex

1 - Aufbau des Volltextindex

Aufbau des VolltextindexDer Volltextindex für die Datenbank besteht hauptsächlich aus einer Worttabelle, einer Worttyptabelle und einer Linktabellen zu den indizierten Tabellen. Die Beziehungen werden über Foreign Keys hergestellt.

Worttabelle

In der Worttabelle werden die einzelnen Wörter und Wortteile gespeichert. Die Spalte für die Wörter hat einen eindeutigen, berechneten Index. Eindeutigkeit ist erforderlich, um doppelte Einträge zu verhindern. Und um unabhängig von der Groß- Kleinschreibung zu sein wird der Index mit LOWER() auf Kleinschreibung getrimmt.

Da die Größe des Index bei Firebird von der Blockgröße der Datenbank abhängig ist, darf die Wortspaltenbreite diesen Wert nicht überschreiten.
CREATE TABLE "words" (
    "PK_wrd"       INTEGER NOT NULL, /* Primärschlüssel  */
    "CL_wrd_word"  VARCHAR(1000)     /* indiziertes Wort */
);

ALTER TABLE "words" ADD CONSTRAINT "PK_words"
    PRIMARY KEY ("PK_wrd");

CREATE UNIQUE INDEX "IDX_wrd_word" ON "words"
    COMPUTED BY (LOWER("CL_wrd_word"));

Worttyptabelle

Um zu unterscheiden, ob ganze Wörter, Wortanfänge, Wortenden und Wortteile verlinkt sind, wird der Typ über einen Foreign Key auf die Worttyptabelle gespeichert.
CREATE TABLE "word_types" (
    "PK_wty"       SMALLINT NOT NULL,
    "CL_wty_name"  VARCHAR(31)
);

ALTER TABLE "word_types" ADD CONSTRAINT "PK_word_types"
    PRIMARY KEY ("PK_wty");

INSERT INTO "word_types" ("PK_wty", "CL_wty_name")
VALUES   (0, 'ganzes Wort');
REINSERT (1, 'Wortanfang' );
REINSERT (2, 'Wortteil'   );
REINSERT (3, 'Wortende'   );

Linktabellen

Die Linktabellen enthalten je einen Foreign Key auf die Worttabelle, die zu indizierende Tabelle und den Worttyp. Weiterhin wird hier die Reihenfolge und Position im Text gespeichert.
Für jede zu indizierende Textspalte einer Tabelle ist entweder eine separate Linktabelle erforderlich oder eine weitere Spalte zur Kennzeichnung verschiedener Textspalten.
CREATE TABLE "text_link_words" (
    "FK_tlw_txt"       INTEGER NOT NULL,
    "FK_tlw_wrd"       INTEGER         ,
    "CL_tlw_index"     INTEGER         ,
    "CL_tlw_position"  INTEGER         ,
    "FK_tlw_wty"       SMALLINT
);

ALTER TABLE "text_link_words" ADD CONSTRAINT "FK_tlw_txt"
    FOREIGN KEY ("FK_tlw_txt") REFERENCES "texts" ("PK_txt")
        ON DELETE CASCADE
        ON UPDATE CASCADE;
ALTER TABLE "text_link_words" ADD CONSTRAINT "FK_tlw_wrd"
    FOREIGN KEY ("FK_tlw_wrd") REFERENCES "words" ("PK_wrd")
        ON DELETE CASCADE
        ON UPDATE CASCADE;
ALTER TABLE "text_link_words" ADD CONSTRAINT "FK_tlw_wty"
    FOREIGN KEY ("FK_tlw_wty") REFERENCES "word_types" ("PK_wty")
        ON DELETE CASCADE
        ON UPDATE CASCADE;