===== 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/