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

Вернуться к списку статей