12 февр. 2008 г.

PostgreSQL 8.3 + Full Text Search

Итак, вышел PostgreSQL 8.3:
http://www.postgresql.org/about/news.918

Original Press Release:
http://www.postgresql.org/about/press/presskit83.html

Несколько поменялся подход к настройке full text search, однако кое-какие наработки из настройки full text search для postgresql 8.2 нам потребуются.

Кое-что можно вычитать из официальной документации, но нас также интересует работа с русским полнотекстовым поиском.
CREATE TEXT SEARCH DICTIONARY russian_ispell (
TEMPLATE = ispell,
DictFile = russian,
AffFile = russian,
StopWords = russian
);

CREATE TEXT SEARCH CONFIGURATION ru ( COPY = russian );

CREATE TEXT SEARCH DICTIONARY english_ispell (
TEMPLATE = ispell,
DictFile = english,
AffFile = english,
StopWords = english
);

CREATE TEXT SEARCH CONFIGURATION en ( COPY = russian );

ALTER TEXT SEARCH CONFIGURATION ru ALTER MAPPING FOR hword, hword_part, word WITH russian_ispell, russian_stem;
ALTER TEXT SEARCH CONFIGURATION ru ALTER MAPPING FOR asciihword, asciiword, hword_asciipart WITH english_ispell, english_stem;


При этом нам потребуются ispell файлы *dict и *affix (в 8.2 это называлось *aff) /usr/share/postgresql/tsearch_data/
  • russian.dict (старое название: russian_utf8.dict)

  • russian.affix (старое название: russian_utf8.aff)

  • english.dict

  • english.affix (старое название: english.aff)


Их можно взять, например, отсюда: http://wiki.services.openoffice.org/wiki/Dictionaries
при этом словари находятся в кодировке koi8-r, а postgresql fts по разумным соображениям требует utf-8, т.о. необоходимо преобразовать словари:
$ iconv -f koi8-r -t utf-8 < ru_RU.aff > /usr/share/postgresql/tsearch_data/russian.affix
$ iconv -f koi8-r -t utf-8 < ru_RU.dic > /usr/share/postgresql/tsearch_data/russian.dict

примечание: конкретные пути расположения файлов, необходимых для postgresql зависит от конкретного дистрибутива.
# select to_tsvector('ru', 'мама мыла раму');
to_tsvector
-------------------------------------
'мама':1 'мыло':2 'мыть':2 'рама':3
(1 запись)
FTS работает !
Однако, хочется использовать настроенную конфигурацию по-умолчанию.
С одной стороны можно делать в каждой сессии
SET default_text_search_config = 'ru';
но это крайне не удобно.
Либо отредактировать /var/lib/postgresql/data/postgresql.conf:
default_text_search_config = 'ru'

PS. в результате подготовки использовались некоторые слайды со второй PostgreSQL-встречи: полнотекстовый поиск

2 комментария:

Анонимный комментирует...

Прочитал в вашем блоге о fts в postgreSQL. Большое спасибо! Помогло решить проблему с koi8r -> utf8. Спасибо!

Vladimir Dolzhenko комментирует...

you are welcome !