Словари от Hunspell для полнотекстового поиска
Словари
Ниже в качестве примеров приводятся инструкции по добавлению русского и английского словаря.
Добавить словарь
-
Подключитесь к базе данных с помощью утилиты
psql. -
Чтобы узнать, какие языки доступны, получите список предустановленных конфигураций для полнотекстового поиска:
SELECT cfgname FROM pg_catalog.pg_ts_config;Результат содержит названия конфигураций, представленные в виде названий языков.
-
Создайте конфигурацию
public.my_configдля полнотекстового поиска:CREATE TEXT SEARCH CONFIGURATION public.my_config ( COPY = pg_catalog.<конфигурация> );В SQL-запросе укажите конфигурацию с нужным языком, полученную на предыдущем шаге.
-
Создайте словарь
my_dictionaryв БД:CREATE TEXT SEARCH DICTIONARY my_dictionary ( TEMPLATE = ispell, DictFile = <набор_слов_в_словаре>, AffFile = <набор_аффиксов>, Stopwords = <стоп-слова> );Параметры SQL-запроса:
TEMPLATE— шаблон, по которому создается словарь. Подробнее о словарях Ispell .DictFile— предустановленный файл с набором слов в виде словаря.AffFile— предустановленный файл с набором аффиксов (приставок, суффиксов и окончаний), которые можно добавить к словам в словаре.Stopwords— стоп-слова, которые не нужно учитывать при полнотекстовом поиске. К таким словам могут относиться, например, предлоги или междометия.
Файлы со словарями и аффиксами, предустановленные в кластерах Managed Service for PostgreSQL:
Язык Словарь DictFileАффиксы AffFileАнглийский en_gb.dicten_GB.affixДатский da_dk.dictda_DK.affixИспанский es_es.dictes_ES.affixИтальянский it_it.dictit_IT.affixНемецкий de_de_frami.dictde_de_frami.affixПольский pl_pl.dictpl_PL.affixРусский ru_ru.dictru_RU.affixУкраинский uk_ua.dictuk_UA.affixЧешский cs_cz.dictcs_CZ.affixТакже доступны примеры словарей от PostgreSQL
:Словарь DictFileАффиксы AffFilehunspell_sample_long.dicthunspell_sample_long.affixhunspell_sample_num.dicthunspell_sample_num.affixispell_sample.dictispell_sample.affixВ SQL-запросе
CREATE TEXT SEARCH DICTIONARYназвания файлов указываются без расширений.dictи.affix. -
Свяжите словарь
my_dictionaryи другие словари с типом токеновword.Токен — искомое слово или фраза. Задается в поисковом запросе и отображается в результатах полнотекстового поиска.
ALTER TEXT SEARCH CONFIGURATION public.my_config ALTER MAPPING FOR word WITH my_dictionary,<список_словарей>;В строке
WITHукажите общедоступные словари с более широким набором слов, напримерenglish_ispellилиenglish_stem. Чем шире словарь, тем позднее он должен быть указан в строкеWITH. -
Сделайте
public.my_configконфигурацией по умолчанию:SET default_text_search_config = 'public.my_config'; -
Проверьте, что конфигурация по умолчанию — это
public.my_config:SHOW default_text_search_config;Результат:
default_text_search_config ---------------------------- public.my_config (1 row) -
Убедитесь, что полнотекстовый поиск выполняется:
SELECT * FROM ts_debug('<токен>');В качестве токена укажите слово, которое можно найти в документах в БД.
Результат:
alias | description | token | dictionaries | dictionary + lexemes -------+-------------------+---------+--------------------------+--------------------------------+------------ word | Word, all letters | <токен> | {<используемые_словари>} | <словарь_с_найденной_лексемой> | {<лексемы>} (1 row)Здесь лексема — слово, которое заменяет однокоренные слова при полнотекстовом поиске. Например, если в документе в БД встречаются слова
облачный
,облаками
иоблаку
, PostgreSQL может распознать их как одно слово — лексемуоблако
.
Примеры
Добавить русский словарь
-
Подключитесь к базе данных с помощью утилиты
psql. -
Создайте конфигурацию
public.my_russian_configдля полнотекстового поиска:CREATE TEXT SEARCH CONFIGURATION public.my_russian_config ( COPY = pg_catalog.russian ); -
Создайте словарь в БД:
CREATE TEXT SEARCH DICTIONARY russian_hunspell ( TEMPLATE = ispell, DictFile = ru_ru, AffFile = ru_RU, Stopwords = russian ); -
Свяжите словари
russian_hunspellиrussian_stemс типом токеновword:ALTER TEXT SEARCH CONFIGURATION public.my_russian_config ALTER MAPPING FOR word WITH russian_hunspell, russian_stem; -
Сделайте
public.my_russian_configконфигурацией по умолчанию:SET default_text_search_config = 'public.my_russian_config'; -
Проверьте, что конфигурация по умолчанию — это
public.my_russian_config:SHOW default_text_search_config;Результат:
default_text_search_config ---------------------------- public.my_russian_config (1 row) -
Убедитесь, что полнотекстовый поиск выполняется:
SELECT * FROM ts_debug('<токен>');В качестве токена укажите слово, которое можно найти в документах в БД.
Результат:
alias | description | token | dictionaries | dictionary + lexemes -------+-------------------+---------+---------------------------------+------------------+------------ word | Word, all letters | <токен> | {russian_hunspell,russian_stem} | russian_hunspell | {<лексемы>} (1 row)
Добавить английский словарь
-
Подключитесь к базе данных с помощью утилиты
psql. -
Создайте конфигурацию
public.my_english_configдля полнотекстового поиска:CREATE TEXT SEARCH CONFIGURATION public.my_english_config ( COPY = pg_catalog.english ); -
Создайте словарь в БД:
CREATE TEXT SEARCH DICTIONARY english_hunspell ( TEMPLATE = ispell, DictFile = en_gb, AffFile = en_GB, Stopwords = english ); -
Свяжите словари
english_hunspellиenglish_stemс типом токеновword:ALTER TEXT SEARCH CONFIGURATION public.my_english_config ALTER MAPPING FOR word WITH english_hunspell, english_stem; -
Сделайте
public.my_english_configконфигурацией по умолчанию:SET default_text_search_config = 'public.my_english_config'; -
Проверьте, что конфигурация по умолчанию — это
public.my_english_config:SHOW default_text_search_config;Результат:
default_text_search_config ---------------------------- public.my_english_config (1 row) -
Убедитесь, что полнотекстовый поиск выполняется:
SELECT * FROM ts_debug('<токен>');В качестве токена укажите слово, которое можно найти в документах в БД.
Результат:
alias | description | token | dictionaries | dictionary + lexemes -------+-------------------+---------+---------------------------------+------------------+------------ word | Word, all letters | <токен> | {english_hunspell,english_stem} | english_hunspell | {<лексемы>} (1 row)