(Č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;