Полнотекстовый поиск
в
PostgreSQL 8.3
● Поиск
● Поиск документов, удовлетворяющих запросу
● релевация
● Требования
● транзакции
● Моментальность (online)
● Морфология
● Гибкость
● Масштабируемость/производительность
id
--- id
Title Did --
------ ---- Author
Abstract Aid ---------
----------- ----
Keywords
-------------
Body
● plainto_tsquery([CFG,] TEXT):
select plainto_tsquery('simple', 'Мама раму');
plainto_tsquery
-----------------
'мама' & 'раму'
GIN
● Быстрый поиск
● Медленная вставка
GIST
● Медленный поиск
● Быстрая вставка
DOCUMENT
PARSER
(token, token_type)
dicts(token_type)
NO
YES
i=0 YES
ask DICT[i]
i=i+1 i<N
NO NO
YES
IS STOP ? tsvector
YES NO
Олег Бартунов, Федор Сигаев 2008
Конфигурации
● \dF
● \dF+ russian
● # SELECT to_tsvector('russian', 'Мама мыла раму');
to_tsvector
-------------------------
'мам':1 'мыл':2 'рам':3
\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
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
● \dF
● \dFd
● \dFt
● \dFp
● ts_debug()
● ts_lexize()
● ts_parse()
Опции:
● StartSel, StopSel
● MaxWords, MinWords
● ShortWord
● HighlightAll
● 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 *
FROM ts_stat('SELECT fts FROM posts')
ORDER BY ndoc DESC;
● To be or not to be. Блин!
Две конфигурации – со стоп-словами и
без. Первая – для поиcка по
умолчанию, вторая – для индексации и
поиска по требованию пользователя.
''::tsquery Y N Y
to_tsquery() Y Y Y
plain_to_tsquery() N Y N
% cd contrib/pg_trgm
% gmake && su -c 'gmake install' && gmake
installcheck
% psql DB <
/usr/local/pgsql/share/contrib/pg_trgm.sql
id | name | s
---------+---------------+----------
6386 | черная дыра | 0.642857
6388 | Черная дыра | 0.642857
2927 | белая дыра | 0.375
1428 | озоновая дыра | 0.315789
Индексы – GIN или GiST
● http://www.postgresql.org/docs/8.3/static/
● http://www.sai.msu.su/~megera/postgres/
● http://www.sigaev.ru/
Задавайте вопросов