unaccent. Фильтрующий словарь текстового по иска
В исходном дистрибутиве установлено по умолчанию: нет.
Связанные компоненты: отсутствуют.
Схема размещения:
ext
.
Модуль представляет фильтрующий словарь текстового поиска, который убирает надстрочные (диакритические) знаки из лексем. Выводимые словарем данные всегда передаются следующему словарю, если он существует. Применяя словарь, можно выполнить полнотекстовый поиск без учета ударений (диакритики).
Конфигурирование словаря unaccent
заключается в настройке параметра RULES
, который задает базовое имя файла со списком правил преобразования. Этот файл должен находиться в каталоге $SHAREDIR/tsearch_data/
(под $SHAREDIR
понимается каталог с общими данными инсталляции PostgreSQL). Имя файла должно заканчиваться расширением .rules
. Расширение в параметре RULES
не указывается.
Функция unaccent()
удаляет надстрочные (диакритические) знаки из заданной строки, представляя собой обертку вокруг словарей в стиле unaccent
. Может вызываться и вне обычного контекста текстового поиска.
Формат:
unaccent([словарь regdictionary,] строка text) returns text
Если аргумент словарь
опущен, будет использоваться словарь с именем unaccent
, находящийся в той же схеме, что и сама функция unaccent()
.
Доработка
Доработка не проводилась.
Ограничения
Текущую реализацию unaccent
нельзя использовать в качестве нормализующего словаря для словаря thesaurus
.
Установка
Модуль считается «доверенным», поэтому его могут устанавливать пользователи, имеющие право CREATE
в текущей базе данных:
CREATE EXTENSION unaccent SCHEMA ext;
Настройка
Файл правил имеет текстовый формат. Пример содержимого файла $SHAREDIR/tsearch_data/my_rules.rules
:
À A
Á A
 A
à A
Ä A
Å A
Æ AE
Каждая строка представляет одно правило перевода, состоящее из символа с диакритикой, за которым следует символ без диакритики. Первый символ переводится во второй.
Эти два символа должны разделяться пробельным символом, а любые начальные или конечные пробельные символы в этой строке игнорируются.
В качестве альтернативного варианта, если в строке задан всего один символ, вхождения этого символа будут удаляться; это полезно для языков, в которых диакритика представляется отдельными символами.
Роль «символа» может играть любая строка, не содержащая пробельные символы, так что unaccent-словари могут быть полезны и для другого рода замены подстрок, а не только для удаления диакритик.
Как и другие файлы конфигурации текстового поиска в PostgreSQL, файл правил должен иметь кодировку UTF-8. При загрузке данные из него будут автоматически преобразованы в кодировку текущей базы данных. Все строки в нем, содержащие непереводимые символы, просто игнорируются, так что файлы правил могут содержать правила, неприменимые в текущей кодировке.
Использование модуля
При установке расширения unaccent
в базе создается шаблон текстового поиска unaccent
и словарь unaccent
на его основе. Для словаря unaccent
по умолчанию определяется параметр RULES='unaccent'
, благодаря чему его можно сразу использовать со стандартным файлом unaccent.rules
.
Можно изменить этот параметр, например:
ALTER TEXT SEARCH DICTIONARY unaccent (RULES='my_rules');
Протестировать этот словарь можно так:
SELECT ts_lexize('unaccent','Hôtel');
Пример вывода результата выполнения запроса:
ts_lexize
-----------
{Hotel}
(1 row)
Функция unaccent()
:
SELECT unaccent('unaccent', 'Hôtel');
-- или следующий формат
SELECT unaccent('Hôtel');
Пример вывода результата выполнения запроса:
unaccent
----------
Hotel
(1 row)
Следующий пример показывает, как вставить словарь unaccent
в конфигурацию текстового поиска:
CREATE TEXT SEARCH CONFIGURATION fr ( COPY = french );
ALTER TEXT SEARCH CONFIGURATION fr
ALTER MAPPING FOR hword, hword_part, word
WITH unaccent, french_stem;
SELECT to_tsvector('fr','Hôtels de la Mer');
Пример вывода результата выполнения запроса:
to_tsvector
-------------------
'hotel':1 'mer':4
(1 row)
SELECT to_tsvector('fr','Hôtel de la Mer') @@ to_tsquery('fr','Hotels');
Пример вывода результата выполнения запроса:
?column?
----------
t
(1 row)
SELECT ts_headline('fr','Hôtel de la Mer',to_tsquery('fr','Hotels'));
Пример вывода результата выполнения запроса:
ts_headline
------------------------
<b>Hôtel</b> de la Mer
(1 row)
Ссылки на документацию разработчика
Исходная документа ция PosgreSQL по модулю unaccent: https://www.postgresql.org/docs/15/unaccent.html.