(Český) Fulltext v Postgre 8.3

dokumentace
http://www.postgresql.org/docs/current/static/textsearch.html
- 12.7. Configuration Example
stránky TSearche (než byl zahrnut do 8.3) (+ slovníky!)
http://www.sai.msu.su/~megera/postgres/gist/tsearch/V2/
starší článek o instalaci českého TSearche
Root.cz: Fulltextování v PostgreSQL - modul tsearch2 ( taky tady )
zmínky
Root.cz: PostgreSQL 8.3: nejen razantní navýšení výkonu

poznámky

 dokument
  jakýkoli ucelený blok textu (třeba i složený z více buňek, tabule…), který se dá dále >>>zpracovat

 zpracování (preprocess) dokumentu
  tokenizace
   SLOVA, čísla, adresy
  lemmatizace tokenů
   slova na normalizované lexémy (lowercase, bez přípon atd.)
    podle přislušných slovníků (synonyma, variace, ) nebo algorytmů
   reprezentace čísel na normalizované znaky
   URL na fragmenty. (fíha)
  vyhodit stop-words (podle seznamu)
  uložení v prohledavatelném tvaru (vektoru)
   (pole lexému, třeba navíc s vyčísleným rankem podle hustoty výskytu)
  
 tsvector
  datový typ, seřazené pole lexémů konkrétního dokumentu

 slovo (word)
  jeden z možných tokenů z dokumentu

 lexém
  normalizovaný tvar slova. (! lemma, ! kořen)
  
 blablabla…

Kuchařka ('nevim co dělám, ale je to podle návodu')

 -- Optatřit slovníky:
 -- http://www.pgsql.cz/data/tsearch2cz-utf8.tar.gz
    -- ( v czech.aff chybí na řádku 2123 za "[^AEIOUY" konec závorky "]"; opravit )
    -- *.aff přejmenovat na *.affix
    -- ujistit se že jsou ve stejném kódování jako je default PG (překódovat)
    -- umístit je (tj czech.stop, czech.dict a czech.affix) v (…)\PostgreSQL\8.3\share\tsearch_data\
    -- (je to přechroupané ze starší verze http://wiki.services.openoffice.org/wiki/Dictionaries#Czech_.28Czech_Republic.29
        -- a přidaný slovník stopwordů)
 -- vytvořit czech.syn tamtéž. nemám data, tak tam dát "cokoli"
 -- postupovat podle http://www.postgresql.org/docs/8.3/static/textsearch-configuration.html :
  
CREATE TEXT SEARCH DICTIONARY czech_synonym ( TEMPLATE = synonym, SYNONYMS = czech );
CREATE TEXT SEARCH DICTIONARY czech_ispell ( TEMPLATE = ispell, DictFile = czech, AffFile = czech, StopWords = czech );
CREATE TEXT SEARCH CONFIGURATION public.pg ( COPY = pg_catalog.english );
ALTER TEXT SEARCH CONFIGURATION pg ALTER MAPPING FOR asciiword, asciihword, hword_asciipart, word, hword, hword_part WITH czech_synonym, czech_ispell;
-- ještě tam bylo ", english_stem". netušim jak moc je to důležitý, ale snad ne tak moc, když máme kloudný affix

SET default_text_search_config = 'public.pg';


-- máme slovníky, tj můžeme vektorizovat česky. což je s tak velkym slovníkem maso, takže hurá na indexy:


ALTER TABLE ceska_tabule ADD COLUMN tsvektorizovana_data tsvector;
UPDATE ceska_tabule SET tsvektorizovana_data =
     to_tsvector('pg', coalesce(text,'') || coalesce(heading,'')); -- "text" a "heading" samozřejmě pokud tam něco takového je : )

CREATE INDEX index_pro_ceskou_tabuli ON ceska_tabule USING gin(tsvektorizovana_data);

-- juchů!

užitečnosti, dobrý znát:
-- SHOW default_text_search_config;
-- select * from pg_ts_dict;
-- delete FROM pg_ts_dict WHERE dictname='czech_ispell';


co nevím

- česká synonyma 
- platnost nastavení (pro konekci nebo nafurt?)
- v zásadě tomu vůbec nerozumim : )









odpad

-- SELECT id,text FROM data  WHERE to_tsvector(text) @@ to_tsquery('rfc');

--CREATE INDEX data_idx ON cs_text USING gin(textsearchable_index_col);
-- drop INDEX data_idx

SELECT id,text,heading FROM cs_text WHERE textsearchable_index_col @@ to_tsquery('pg','psát'); --  absurdnějšího

/*
ALTER TABLE cs_text ADD COLUMN textsearchable_index_col tsvector;
UPDATE cs_text SET textsearchable_index_col =
     to_tsvector('pg', coalesce(text,'') || coalesce(heading,''));


show gin(textsearchable_index_col);
*/
-- SELECT to_tsvector('english','I have been walking down the street');

-- CREATE TEXT SEARCH DICTIONARY public.simple_cz_dict ( TEMPLATE = pg_catalog.simple, STOPWORDS = czech );

-- SHOW default_text_search_config;


-- CREATE TEXT SEARCH CONFIGURATION public.pg ( COPY = pg_catalog.english );
-- CREATE TEXT SEARCH DICTIONARY czech_synonym ( TEMPLATE = synonym, SYNONYMS = czech_synonym_test );

-- CREATE TEXT SEARCH DICTIONARY czech_ispell ( TEMPLATE = ispell, DictFile = czech, AffFile = czech, StopWords = czech );

-- ALTER TEXT SEARCH CONFIGURATION pg ALTER MAPPING FOR asciiword, asciihword, hword_asciipart, word, hword, hword_part WITH czech_synonym, czech_ispell;
--, english_stem;




-- select * from pg_ts_dict;