Слайды сентябрьской 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: