Слайды сентябрьской PostgreSQL-встречи: полнотекстовый поиск в PostgreSQL
16-го сентября 2008 года состоялась очередная, сентябрьская встреча Российского сообщества пользователей PostgreSQL.
Основная тема встречи: полнотекстовый поиск. Речь шла прежде всего о возможностях текущей реализации полнотекстового поиска в PostgreSQL версии 8.3.
Фёдор Сигаев и Иван Золотухин представили обширную демонстрацию возможностей и ответили на вопросы слушателей.
Слайды и скрипты демонстрации:
==================================== \d posts SELECT count(*) FROM posts; ALTER TABLE posts ADD COLUMN fts tsvector; \d posts UPDATE posts SET fts = to_tsvector('simple', msg_text); VACUUM ANALYZE; SELECT count(*) FROM posts WHERE fts @@ plainto_tsquery('simple', 'Мама раму'); CREATE INDEX gistidx ON posts USING gist (fts); DROP INDEX gistidx; CREATE INDEX ginidx ON posts USING gin (fts); SELECT count(*) FROM posts WHERE fts @@ plainto_tsquery('simple', 'Мама рама'); DROP INDEX ginidx; \dF \dF+ SELECT to_tsvector('russian', 'Мама мыла раму'); SELECT plainto_tsquery('russian', 'Мама мыла раму'); UPDATE posts SET fts = to_tsvector('russian', msg_text); SELECT count(*) FROM posts WHERE fts @@ plainto_tsquery('russian', 'Мама рама'); SELECT to_tsvector('russian', 'валил валившийся вал'); SELECT to_tsvector('russian', 'вокзал в вокзале'); SELECT to_tsvector('russian', 'батарея батарею'); CREATE TEXT SEARCH DICTIONARY ru_ispell ( TEMPLATE = ispell, DictFile = ru_RU, AffFile = ru_RU, StopWords = russian ); ALTER TEXT SEARCH CONFIGURATION ru ALTER MAPPING FOR hword, hword_part, word WITH ru_ispell, russian_stem; SELECT to_tsvector('ru', 'валил валившийся вал'); SELECT to_tsvector('ru', 'вокзал в вокзале'); SELECT to_tsvector('ru', 'батарея батарею'); SELECT to_tsvector('ru', 'незастолбленное слово'); UPDATE posts SET fts = to_tsvector('ru', msg_text); VACUUM ANALYZE; CREATE INDEX ginidx ON posts USING gin (fts); SELECT * FROM ts_debug('ru', 'Мама мыла агромедную раму в room'); SELECT ts_lexize('ru_ispell', 'туши'); ELECT * FROM ts_parse('default', '123 - a number'); SELECT id, ts_rank_cd(fts, q) AS r FROM posts, plainto_tsquery('ru', 'Москва') AS q WHERE fts @@ q ORDER BY r DESC LIMIT 10; SELECT id, ts_rank_cd(fts, q) AS r FROM posts, plainto_tsquery('ru', 'Москва Питер') AS q WHERE fts @@ q ORDER BY r DESC LIMIT 10; SELECT id, ts_rank(fts, q) AS r FROM posts, plainto_tsquery('ru', 'Москва Питер') AS q WHERE fts @@ q ORDER BY r DESC LIMIT 10; SELECT id, ts_headline('ru', msg_text, q) , ts_rank_cd(fts, q) AS r FROM posts, plainto_tsquery('ru', 'Москва Питер') AS q WHERE fts @@ q ORDER BY r DESC LIMIT 10; SELECT id, ts_headline('ru', msg_text, q), r FROM ( SELECT *, ts_rank_cd(fts, q) AS r FROM posts, plainto_tsquery('ru', 'Москва Питер') AS q WHERE fts @@ q ORDER BY r DESC LIMIT 10 ) AS res; SELECT * FROM ts_stat('SELECT fts FROM posts') ORDER BY ndoc DESC; SELECT * FROM ts_stat('SELECT fts FROM posts ORDER BY id LIMIT 1000') ORDER BY ndoc DESC LIMIT 20;
В завершение встречи Олег Бартунов рассказал о планах по развитию подсистемы полнотекстового поиска, о том, что планируется к выходу в 8.4 и даже о том, что будет после 8.4: