602SQL-Úplná dokumentace Index  

Fulltextové systémy - indexace

Automatické zaindexovávání dokumentů

Automatické zaindexovávání dokumentů zajišťuje, že se při vytváření, rušení a změnách dokumentů ihned upravují fulltextové indexy. Vyhledávání pomocí fulltextových nástrojů pak neustále vychází z aktuální množiny dokumentů.

Automatické zaindexování probíhá podle specifikací tzv. fulltextových triggerů zadaných v popisu fulltextového systému. Změnu automatického zaindexování lze zajistit pomocí příkazu ALTER FULLTEXT.

Každý požadavek na automatické zaindexovávání obsahuje jméno dokumentové tabulky a jména jejích dvou sloupců: sloupce s dokumentem a sloupce s číslem dokumentu. Dále musí obsahovat informaci o způsobu uložení dokumentu (v tabulce, v externím souboru) a může obsahovat informaci o vnitřním formátu dokumentu. Interaktivní práce s definicí fulltextového systému (či případné přeindexování) se provádí z prostředí návrháře fulltextu.

Je-li dokument uložen v externím souboru, pak se o jeho přepsání SQL server nedozví. Pro přeindexování takového dokumentu je třeba buď provést SQL příkaz UPDATE na sloupec s odkazem na tento dokument, anebo zavolat funkci pro manuální zaindexování popsanou níže.

Příklad:

Ukázka definice objektu typu fulltext s fulltextovým triggerem pro automatické indexování:

CREATE FULLTEXT FT_TEST LANGUAGE 0 LEMMATIZED NOT SUBSTRUCTURED
(DOCTAB ID_DOC DOC,'TXT')

Manuální zaindexovávání dokumentu

Při použítí manuálního zaindexovávání dokumentů lze mít pod kontrolou okamžik, v němž se upravují fulltextové indexy. Lze například naplánovat změny v indexech pro všechny změněné dokumenty až na noční hodiny.

Pro explicitní zaindexování konkrétního dokumentu slouží funkce Fulltext_index_doc. Fulltextový systém je třeba v tomto případě vytvořit BEZ fulltextových triggerů (ať příkazem CREATE FULLTEXT nebo z návrháře).

Pokud se dokument nachází v souboru, pak je nutno volat funkci pro zaindexování na tom počítači, na němž je soubor dostupný. Proto SQL procedura prováděná na databázovém serveru obvykle nemůže zaindexovat dokument zacházející se v souboru na klientském počítači. Pro tento případ existuje funkce Fulltext_index_doc také v klientském API.

Pokud je dokument či jeho obsah zrušen, pak je třeba jej odstranit z indexu pomocí funkce SQL Fulltext_remove_doc.

Funkci Fulltext_remove_doc není třeba volat po změně v dokumentu před voláním funkce Fulltext_index_doc - starý obsah dokumentu je při novém indexování odstraněn automaticky.

Zaindexovávání dokumentů lze částečně automatizovat tím, že se funkce pro manuální zaindexování umístí do triggerů, které sledují vkládání, rušení a přepisování záznamů v tabulce dokumentů. Tím se ovšem ztratí možnost odloženého indexování.

Příklad:

Ukázka definice objektu typu fulltext bez fulltextových triggerů pro manuální indexování:

CREATE FULLTEXT FT_TEST2 LANGUAGE 0 LEMMATIZED NOT SUBSTRUCTURED
()

Ukázka SQL triggeru, který slouží k indexování:

TRIGGER `Doctab_UPD_ftx` AFTER UPDATE OF doc
ON `Doctab`
REFERENCING NEW AS newrec FOR EACH ROW
BEGIN
  CALL Fulltext_index_doc('.ft_test2', newrec.id_doc, newrec.doc, 'txt', 0);
END

Ukázka SQL procedury, která zaindexuje dosud neindexované dokumenty:

PROCEDURE `deferred_indexing`( );
BEGIN
  DECLARE i INTEGER DEFAULT 0;
  FOR row AS cx CURSOR FOR
    SELECT id_doc, doc, indexed 
    FROM Doctab
    WHERE NOT indexed
  DO
    CALL Fulltext_index_doc('.ft_test_deferred', row.id_doc, row.doc, 'txt', 0);
    UPDATE SET indexed = TRUE WHERE CURRENT OF cx;
    SET i = i+1;
  END FOR;
  CALL Log_write(Int2str(i)+' document(s) indexed');
END