32
Олег Бартунов, Федор Сигаев 2008 ПП в P Полнотекстовый поиск в PostgreSQL 8.3

Вторая PostgreSQL-встреча: полнотекстовый поиск. Часть 1

Embed Size (px)

DESCRIPTION

Вторая PostgreSQL-встреча: полнотекстовый поиск. Часть 1: полнотекстовый поиск в PostgreSQL 8.3, демонстрация возможностей (Фёдор Сигаев)

Citation preview

Page 1: Вторая PostgreSQL-встреча: полнотекстовый поиск. Часть 1

Олег Бартунов, Федор Сигаев 2008

ПП в P

Полнотекстовый поиск

вPostgreSQL 8.3

Page 2: Вторая PostgreSQL-встреча: полнотекстовый поиск. Часть 1

Олег Бартунов, Федор Сигаев 2008

ПП в Р - Prerequisites

● Что такое БД и как пользоваться● PostgreSQL 8.3+ ( в предыдущих надо

contrib/tsearch2)ставить● contrib/pg_trgm● PgSQLМинимальные навыки работы с

Page 3: Вторая PostgreSQL-встреча: полнотекстовый поиск. Часть 1

Олег Бартунов, Федор Сигаев 2008

ПП в P

● Поиск● , Поиск документов удовлетворяющих запросу● релевация

● Требования● RDBMS (ACID)Полная интеграция с

● транзакции● , конкуррентность восстановление после сбоя● (online)Моментальность

● Морфология● Гибкость● /Масштабируемость производительность

Page 4: Вторая PostgreSQL-встреча: полнотекстовый поиск. Часть 1

Олег Бартунов, Федор Сигаев 2008

Документ для ПП

id---Title------Abstract-----------Keywords-------------Body

Did----Aid----

Title || Abstract || Keywords || Body || Author

id--Author---------

Page 5: Вторая PostgreSQL-встреча: полнотекстовый поиск. Часть 1

Олег Бартунов, Федор Сигаев 2008

Специальный типы для ПП

● tsvector – представление документа для поиска

● tsquery – представление поискового (&, |, !)запроса

● Операция поиска tsquery @@ tsvector

Page 6: Вторая PostgreSQL-встреча: полнотекстовый поиск. Часть 1

Олег Бартунов, Федор Сигаев 2008

Создание значений tsvector

● ' :1 :2 :3 :4'::tsvectorмама мыла мою раму● ' :1 :2 :3'::tsvectorнаграда нашла героя● to_tsvector([CFG,], TEXT):

select to_tsvector('simple', ' ');Награда нашла героя to_tsvector--------------------------------- ' ':3 ' ':2 ' ':1героя нашла награда

Page 7: Вторая PostgreSQL-встреча: полнотекстовый поиск. Часть 1

Олег Бартунов, Федор Сигаев 2008

Создание значений tsquery

● ' & '::tsqueryмама раму● to_tsquery([CFG,] TEXT):

select to_tsquery('simple', ' & ');Мама раму to_tsquery ----------------- ' ' & ' 'мама раму

● plainto_tsquery([CFG,] TEXT):select plainto_tsquery('simple', ' ');Мама раму plainto_tsquery ----------------- ' ' & ' 'мама раму

Page 8: Вторая PostgreSQL-встреча: полнотекстовый поиск. Часть 1

Олег Бартунов, Федор Сигаев 2008

tsvector @@ tsquery

# select to_tsvector('simple', ' ') @@Мама мыла раму to_tsquery('simple', ' & ');Мама раму

?column?

----------

t

# select count(*) from posts where fts @@ plainto_tsquery(' ?')Неужели так просто

Page 9: Вторая PostgreSQL-встреча: полнотекстовый поиск. Часть 1

Олег Бартунов, Федор Сигаев 2008

Первый эксперимент

● posts ( Таблица мы благодарны, пользователям сгенерившим этот

)пример● tsvectorКолонка● Заполнение колонки● !Все● ?!Все

Page 10: Вторая PostgreSQL-встреча: полнотекстовый поиск. Часть 1

Олег Бартунов, Федор Сигаев 2008

Разгон поиска - индексы

GIN● Быстрый поиск● Медленная вставка

GIST● Медленный поиск● Быстрая вставка

Page 11: Вторая PostgreSQL-встреча: полнотекстовый поиск. Часть 1

Олег Бартунов, Федор Сигаев 2008

А морфология?

– „ “ Словари инфинитизация слов

# \dFp+

Page 12: Вторая PostgreSQL-встреча: полнотекстовый поиск. Часть 1

Олег Бартунов, Федор Сигаев 2008

to_tsvector()

PARSER

(token, token_type)

dicts(token_type)

i=0

ask DICT[i]

YESNO

i=i+1 i < N

YES

NO

IS STOP ?NO

tsvectorYES

NOYES

DOCUMENT

Page 13: Вторая PostgreSQL-встреча: полнотекстовый поиск. Часть 1

Олег Бартунов, Федор Сигаев 2008

Конфигурации

● \dF● \dF+ russian● # SELECT to_tsvector('russian', ' ');Мама мыла раму

to_tsvector ------------------------- ' ':1 ' ':2 ' ':3мам мыл рам

● # SELECT plainto_tsquery('russian', ' ');Мамы рамы plainto_tsquery ----------------- ' ' & ' 'мам рам

Page 14: Вторая PostgreSQL-встреча: полнотекстовый поиск. Часть 1

Олег Бартунов, Федор Сигаев 2008

Snowball

\dF+ russian

# SELECT to_tsvector('russian', ' ');валил валившийся вал to_tsvector ------------- ' ':1,2,3вал

# SELECT to_tsvector('russian', ' вокзал в ');вокзале to_tsvector ---------------------- ' ':1 ' ':3вокза вокзал

# SELECT to_tsvector('russian', ' ');батарея батарею to_tsvector ---------------------- ' ':2 ' ':1батар батаре

Page 15: Вторая PostgreSQL-встреча: полнотекстовый поиск. Часть 1

Олег Бартунов, Федор Сигаев 2008

Ispell, Myspell, Hunspell

http://wiki.services.openoffice.org/wiki/Dictionaries

% unzip ru_RU.zip

% iconv -f koi8-ru -t utf-8 < ru_RU.aff > /usr/local/pgsql/share/tsearch_data/ru_ru.affix

% iconv -f koi8-ru -t utf-8 < ru_RU.dic > /usr/local/pgsql/share/tsearch_data/ru_ru.dict

Page 16: Вторая PostgreSQL-встреча: полнотекстовый поиск. Часть 1

Олег Бартунов, Федор Сигаев 2008

Ispell - настройка

# CREATE TEXT SEARCH DICTIONARY ru_ispell ( TEMPLATE = ispell, DictFile = ru_ru, AffFile = ru_ru, StopWords = russian);

# CREATE TEXT SEARCH CONFIGURATION ru (COPY = russian);

# ALTER TEXT SEARCH CONFIGURATION ru ALTER MAPPING FOR hword, hword_part, word WITH ru_ispell, russian_stem;

Page 17: Вторая PostgreSQL-встреча: полнотекстовый поиск. Часть 1

Олег Бартунов, Федор Сигаев 2008

Ы?

# SELECT to_tsvector('ru', ' ');валил валившийся вал to_tsvector----------------------------------- ' ':3 ' ':1 ' ':2вал валить валившийся

# SELECT to_tsvector('ru', ' ');вокзал в вокзале to_tsvector --------------' ':1,3вокзал

# SELECT to_tsvector('ru', ' ');батарея батарею to_tsvector --------------- ' ':1,2батарея

# SELECT to_tsvector('ru', ' ');незастолбленное слово to_tsvector ---------------------------- ':2 ' ':1слово незастолблен

Page 18: Вторая PostgreSQL-встреча: полнотекстовый поиск. Часть 1

Олег Бартунов, Федор Сигаев 2008

Отладка

● \dF● \dFd● \dFt● \dFp● ts_debug()● ts_lexize()● ts_parse()

Page 19: Вторая PostgreSQL-встреча: полнотекстовый поиск. Часть 1

Олег Бартунов, Федор Сигаев 2008

Релевация

● ts_rank([real[],] tsvector, tsquery[, int4] )● ts_rank_cd([real[],] tsvector, tsquery [, int4])

4 – A,B,C,D (default):класса лексемSELECT setweight(to_tsvector('ru', ' '), 'A') Солнце|| to_tsvector('ru', ' ');Это просто звезда

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;

Page 20: Вторая PostgreSQL-встреча: полнотекстовый поиск. Часть 1

Олег Бартунов, Федор Сигаев 2008

Headline/выжимка

ts_headline([CFG,] TEXT, TSQUERY [, OPTS])# SELECT nextval, 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;

:Опции

● StartSel, StopSel

● MaxWords, MinWords

● ShortWord

● HighlightAll

Page 21: Вторая PostgreSQL-встреча: полнотекстовый поиск. Часть 1

Олег Бартунов, Федор Сигаев 2008

Продвинутые словари

● Synonym – замена слова на слово● Thesaurus – замена фразы на фразу● Словарь чисел

3.14159265358979323846 => 3.14● Regex словарь● Профессинальные словари● Словарь химических формул

Page 22: Вторая PostgreSQL-встреча: полнотекстовый поиск. Часть 1

Олег Бартунов, Федор Сигаев 2008

Типсы и Триксы - 1

● default_text_search_config● tsvector_update_trigger Триггеры и

tsvector_update_trigger_column● tsvector || tsvector● setweight(), strip()● tsquery && tsquery

tsquery || tsquery!! tsquery

● numnode(tsquery), length(tsvector), querytree(tsquery)

Page 23: Вторая PostgreSQL-встреча: полнотекстовый поиск. Часть 1

Олег Бартунов, Федор Сигаев 2008

Типсы и Триксы - 2

● 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 ... @@ to_tsquery(' :AB');Солнце

● UPDATE tbl SET fts= setweight( coalesce( to_tsvector(title),''),'B') || setweight( coalesce( to_tsvector(keywords),''),'A') || setweight( coalesce( to_tsvector(body),''),'D');

(tsvector || NULL) => NULL

Page 24: Вторая PostgreSQL-встреча: полнотекстовый поиск. Часть 1

Олег Бартунов, Федор Сигаев 2008

Типсы и Триксы - 3

● SELECT * FROM ts_stat('SELECT fts FROM posts') ORDER BY ndoc DESC;

● To be or not to be. !Блин – - Две конфигурации со стоп словами и. – c без Первая для пои ка по

, – умолчанию вторая для индексации и .поиска по требованию пользователя

Page 25: Вторая PostgreSQL-встреча: полнотекстовый поиск. Часть 1

Олег Бартунов, Федор Сигаев 2008

Типсы и триксы - 4

● Курск столкнулся с Останкинской. – башней Курск город или подводная

?лодкаQuery rewriting: - New York => Gottham, NYC, Big Apple - => Курск подводная лодка Курск

● ? А нужны ли позиции и релевированиеstrip()

Page 26: Вторая PostgreSQL-встреча: полнотекстовый поиск. Часть 1

Олег Бартунов, Федор Сигаев 2008

Типсы и Триксы - 5

VLDB (Very Large Database)● Partitioning, sharding ( и по серверам

, тоже релевация не зависит от!)коллекции

● GIN на архивной части● GiST на свежей части● gin_fuzzy_search_limit

Page 27: Вторая PostgreSQL-встреча: полнотекстовый поиск. Часть 1

Олег Бартунов, Федор Сигаев 2008

Типсы и Триксы - 6

''::tsquery

to_tsquery()

plain_to_tsquery()

Синтаксис Морфология Веса

Y

Y

Y

YY

Y

N

N N

to_tsquery ||, && !!Создавайте свои обертки с помощью и и

Page 28: Вторая PostgreSQL-встреча: полнотекстовый поиск. Часть 1

Олег Бартунов, Федор Сигаев 2008

pg_trgm - инсталляция

% cd contrib/pg_trgm

% gmake && su -c 'gmake install' && gmake installcheck

% psql DB < /usr/local/pgsql/share/contrib/pg_trgm.sql

Page 29: Вторая PostgreSQL-встреча: полнотекстовый поиск. Часть 1

Олег Бартунов, Федор Сигаев 2008

pg_trgm

# SELECT show_trgm(' ');Черная дыра show_trgm --------------------------------------------------------------{" ", , , ," ", , , ," "," "," "," "}ая дыр ерн ная ра рна ыра чер ды че д ч

# SELECT similarity(' ' , ' ');Черная дыра Белая дыра similarity ------------ 0.352941

# SELECT show_limit(); show_limit ------------ 0.3

# SELECT ' ' % ' ';Черная дыра Белая дыра ?column? ---------- t

Page 30: Вторая PostgreSQL-встреча: полнотекстовый поиск. Часть 1

Олег Бартунов, Федор Сигаев 2008

pg_trgm

# SELECT *, similarity(name, ' ') AS sдыра чрнаяFROM keywords WHERE name % ' ' дыра чрнаяORDER BY s DESC;

id | name | s ---------+---------------+---------- 6386 | | 0.642857черная дыра 6388 | | 0.642857Черная дыра 2927 | | 0.375белая дыра 1428 | | 0.315789озоновая дыра

– GIN GiSTИндексы или

Page 31: Вторая PostgreSQL-встреча: полнотекстовый поиск. Часть 1

Олег Бартунов, Федор Сигаев 2008

Ссылки

● http://www.postgresql.org/docs/8.3/static/● http://www.sai.msu.su/~megera/postgres/● http://www.sigaev.ru/

Page 32: Вторая PostgreSQL-встреча: полнотекстовый поиск. Часть 1

Олег Бартунов, Федор Сигаев 2008

Хотите ответов?

Задавайте вопросов