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