===== Fulltext vyhledávání ===== Popis jak nastavit české fulltextové vyhledávání v postgresql za pomocí českého ispell slovníku. - vytvoříme sloupeček, ve kterém se bude hledat ALTER TABLE items ADD COLUMN search_text TSVECTOR DEFAULT NULL; - do /usr/share/postgresql/9.3/tsearch_data je potřeba nahrát slovníky {{:it:postgresql:ispell-czech.zip|český ispell}} - je potřeba vytvořit slovník CREATE TEXT SEARCH DICTIONARY czech_ispell ( TEMPLATE = ispell, DictFile = czech, AffFile = czech, StopWords = czech ); - 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; - 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); - 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(); - nyní je možné volat hledání s jazykem czech SELECT * FROM items where search_text @@ to_tsquery('czech', 'keyword'); ==== Zajímavé odkazy ==== * http://antjanus.com/blog/tutorials/using-postgresql-as-a-search-engine/ * http://www.postgresql.org/docs/9.3/static/textsearch-dictionaries.html * http://www.scottlowe.eu/blog/2011/04/28/postgresql-full-text-search-is-often-good-enough/