Upload
nikolay-samokhvalov
View
2.002
Download
3
Embed Size (px)
DESCRIPTION
Вторая PostgreSQL-встреча: полнотекстовый поиск. Часть 1: полнотекстовый поиск в PostgreSQL 8.3, демонстрация возможностей (Фёдор Сигаев)
Citation preview
Олег Бартунов, Федор Сигаев 2008
ПП в P
Полнотекстовый поиск
вPostgreSQL 8.3
Олег Бартунов, Федор Сигаев 2008
ПП в Р - Prerequisites
● Что такое БД и как пользоваться● PostgreSQL 8.3+ ( в предыдущих надо
contrib/tsearch2)ставить● contrib/pg_trgm● PgSQLМинимальные навыки работы с
Олег Бартунов, Федор Сигаев 2008
ПП в P
● Поиск● , Поиск документов удовлетворяющих запросу● релевация
● Требования● RDBMS (ACID)Полная интеграция с
● транзакции● , конкуррентность восстановление после сбоя● (online)Моментальность
● Морфология● Гибкость● /Масштабируемость производительность
Олег Бартунов, Федор Сигаев 2008
Документ для ПП
id---Title------Abstract-----------Keywords-------------Body
Did----Aid----
Title || Abstract || Keywords || Body || Author
id--Author---------
Олег Бартунов, Федор Сигаев 2008
Специальный типы для ПП
● tsvector – представление документа для поиска
● tsquery – представление поискового (&, |, !)запроса
● Операция поиска tsquery @@ tsvector
Олег Бартунов, Федор Сигаев 2008
Создание значений tsvector
● ' :1 :2 :3 :4'::tsvectorмама мыла мою раму● ' :1 :2 :3'::tsvectorнаграда нашла героя● to_tsvector([CFG,], TEXT):
select to_tsvector('simple', ' ');Награда нашла героя to_tsvector--------------------------------- ' ':3 ' ':2 ' ':1героя нашла награда
Олег Бартунов, Федор Сигаев 2008
Создание значений tsquery
● ' & '::tsqueryмама раму● to_tsquery([CFG,] TEXT):
select to_tsquery('simple', ' & ');Мама раму to_tsquery ----------------- ' ' & ' 'мама раму
● plainto_tsquery([CFG,] TEXT):select plainto_tsquery('simple', ' ');Мама раму plainto_tsquery ----------------- ' ' & ' 'мама раму
Олег Бартунов, Федор Сигаев 2008
tsvector @@ tsquery
# select to_tsvector('simple', ' ') @@Мама мыла раму to_tsquery('simple', ' & ');Мама раму
?column?
----------
t
# select count(*) from posts where fts @@ plainto_tsquery(' ?')Неужели так просто
Олег Бартунов, Федор Сигаев 2008
Первый эксперимент
● posts ( Таблица мы благодарны, пользователям сгенерившим этот
)пример● tsvectorКолонка● Заполнение колонки● !Все● ?!Все
Олег Бартунов, Федор Сигаев 2008
Разгон поиска - индексы
GIN● Быстрый поиск● Медленная вставка
GIST● Медленный поиск● Быстрая вставка
Олег Бартунов, Федор Сигаев 2008
А морфология?
– „ “ Словари инфинитизация слов
# \dFp+
Олег Бартунов, Федор Сигаев 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
Олег Бартунов, Федор Сигаев 2008
Конфигурации
● \dF● \dF+ russian● # SELECT to_tsvector('russian', ' ');Мама мыла раму
to_tsvector ------------------------- ' ':1 ' ':2 ' ':3мам мыл рам
● # SELECT plainto_tsquery('russian', ' ');Мамы рамы plainto_tsquery ----------------- ' ' & ' 'мам рам
Олег Бартунов, Федор Сигаев 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батар батаре
Олег Бартунов, Федор Сигаев 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
Олег Бартунов, Федор Сигаев 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;
Олег Бартунов, Федор Сигаев 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слово незастолблен
Олег Бартунов, Федор Сигаев 2008
Отладка
● \dF● \dFd● \dFt● \dFp● ts_debug()● ts_lexize()● ts_parse()
Олег Бартунов, Федор Сигаев 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;
Олег Бартунов, Федор Сигаев 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
Олег Бартунов, Федор Сигаев 2008
Продвинутые словари
● Synonym – замена слова на слово● Thesaurus – замена фразы на фразу● Словарь чисел
3.14159265358979323846 => 3.14● Regex словарь● Профессинальные словари● Словарь химических формул
Олег Бартунов, Федор Сигаев 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)
Олег Бартунов, Федор Сигаев 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
Олег Бартунов, Федор Сигаев 2008
Типсы и Триксы - 3
● SELECT * FROM ts_stat('SELECT fts FROM posts') ORDER BY ndoc DESC;
● To be or not to be. !Блин – - Две конфигурации со стоп словами и. – c без Первая для пои ка по
, – умолчанию вторая для индексации и .поиска по требованию пользователя
Олег Бартунов, Федор Сигаев 2008
Типсы и триксы - 4
● Курск столкнулся с Останкинской. – башней Курск город или подводная
?лодкаQuery rewriting: - New York => Gottham, NYC, Big Apple - => Курск подводная лодка Курск
● ? А нужны ли позиции и релевированиеstrip()
Олег Бартунов, Федор Сигаев 2008
Типсы и Триксы - 5
VLDB (Very Large Database)● Partitioning, sharding ( и по серверам
, тоже релевация не зависит от!)коллекции
● GIN на архивной части● GiST на свежей части● gin_fuzzy_search_limit
Олег Бартунов, Федор Сигаев 2008
Типсы и Триксы - 6
''::tsquery
to_tsquery()
plain_to_tsquery()
Синтаксис Морфология Веса
Y
Y
Y
YY
Y
N
N N
to_tsquery ||, && !!Создавайте свои обертки с помощью и и
Олег Бартунов, Федор Сигаев 2008
pg_trgm - инсталляция
% cd contrib/pg_trgm
% gmake && su -c 'gmake install' && gmake installcheck
% psql DB < /usr/local/pgsql/share/contrib/pg_trgm.sql
Олег Бартунов, Федор Сигаев 2008
pg_trgm
# SELECT show_trgm(' ');Черная дыра show_trgm --------------------------------------------------------------{" ", , , ," ", , , ," "," "," "," "}ая дыр ерн ная ра рна ыра чер ды че д ч
# SELECT similarity(' ' , ' ');Черная дыра Белая дыра similarity ------------ 0.352941
# SELECT show_limit(); show_limit ------------ 0.3
# SELECT ' ' % ' ';Черная дыра Белая дыра ?column? ---------- t
Олег Бартунов, Федор Сигаев 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Индексы или
Олег Бартунов, Федор Сигаев 2008
Ссылки
● http://www.postgresql.org/docs/8.3/static/● http://www.sai.msu.su/~megera/postgres/● http://www.sigaev.ru/
Олег Бартунов, Федор Сигаев 2008
Хотите ответов?
Задавайте вопросов