Словари от 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.dict
en_GB.affix
Датский da_dk.dict
da_DK.affix
Испанский es_es.dict
es_ES.affix
Итальянский it_it.dict
it_IT.affix
Немецкий de_de_frami.dict
de_de_frami.affix
Польский pl_pl.dict
pl_PL.affix
Русский ru_ru.dict
ru_RU.affix
Украинский uk_ua.dict
uk_UA.affix
Чешский cs_cz.dict
cs_CZ.affix
Также доступны примеры словарей от PostgreSQL
:Словарь DictFile
Аффиксы AffFile
hunspell_sample_long.dict
hunspell_sample_long.affix
hunspell_sample_num.dict
hunspell_sample_num.affix
ispell_sample.dict
ispell_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)