Toto je starší verze dokumentu!


Popis jak nastavit fulltextové vyhledávání v postgres za pomocí českého ispell slovníku.

  1. vytvoříme sloupeček, ve kterém se bude hledat
    ALTER TABLE items ADD COLUMN search_text TSVECTOR DEFAULT NULL;
  2. do /usr/share/postgresql/9.3/tsearch_data je potřeba nahrát slovníky český ispell
  3. je potřeba vytvořit slovník
    CREATE TEXT SEARCH DICTIONARY czech_ispell (
        TEMPLATE = ispell,
        DictFile = czech,
        AffFile = czech,
        StopWords = czech
    );
  4. nyní je potřeba vytvořit konfiguraci (tady se dá dost hrat, dole lze definovat spousta slovníků)
    CREATE TEXT SEARCH CONFIGURATION public.czech ( COPY = pg_catalog.english );
    ALTER TEXT SEARCH CONFIGURATION czech
        ALTER MAPPING FOR asciiword, asciihword, hword_asciipart,
                          word, hword, hword_part
        WITH czech_ispell, simple;
    ALTER TEXT SEARCH CONFIGURATION czech DROP MAPPING FOR email, url, url_path, sfloat, float;
  5. vytvoření indexu
    UPDATE items SET search_text = to_tsvector('czech', title || ' ' || (attributes->>'identification')::text);
    CREATE INDEX search_text_gin ON items USING GIN(search_text);
  6. vytvoříme si trigger, který bude pravidelně index udržovat
    CREATE FUNCTION avector_update() RETURNS TRIGGER AS $$
    BEGIN
        IF TG_OP = 'INSERT' THEN
            NEW.search_text = to_tsvector('czech', NEW.title || ' ' || (NEW.attributes->>'identification')::text);
        END IF;
        IF TG_OP = 'UPDATE' THEN
            NEW.search_text = to_tsvector('czech', NEW.title || ' ' || (NEW.attributes->>'identification')::text);
        END IF;
        RETURN NEW;
    END
    $$ LANGUAGE 'plpgsql';
    CREATE TRIGGER ts_search_text BEFORE INSERT OR UPDATE ON items FOR EACH ROW EXECUTE PROCEDURE avector_update();
  7. nyní je možné volat hledání s jazykem czech
    SELECT * FROM items where search_text @@ to_tsquery('czech', 'keyword');

Zajímavé odkazy

  • it/postgresql/czech_fulltext.1429705745.txt.gz
  • Poslední úprava: 2015/04/22 14:29
  • autor: kourim