F.59. unaccent — словарь полнотекстового поиска, который удаляет диакритические знаки#
F.59. unaccent — словарь полнотекстового поиска, который удаляет диакритические знаки #
unaccent
- это словарь текстового поиска, который удаляет ударения (диакритические знаки) из лексем.
Это фильтрующий словарь, что означает, что его вывод всегда передается следующему словарю (если таковой имеется), в отличие от обычного поведения словарей. Это позволяет осуществлять обработку текста без учета ударений для полнотекстового поиска.
Текущая реализация unaccent
не может быть использована в качестве нормализующего словаря для словаря thesaurus
.
Этот модуль считается "доверенным", то есть его можно установить
недоступным пользователям, у которых есть привилегия CREATE
в текущей базе данных.
F.59.1. Конфигурация #
Словарь unaccent
принимает следующие параметры:
RULES
- это базовое имя файла, содержащего список правил перевода. Этот файл должен быть сохранен в$SHAREDIR/tsearch_data/
(где$SHAREDIR
означает общий каталог установки Tantor BE). Его имя должно заканчиваться на.rules
(который не должен включаться в параметрRULES
).
Файл правил имеет следующий формат:
Каждая строка представляет собой одно правило перевода, состоящее из символа с ударением, за которым следует символ без ударения. Первый символ переводится во второй. Например,
À A Á A Â A Ã A Ä A Å A Æ AE
Два символа должны быть разделены пробелом, и любые ведущие или завершающие пробелы на строке игнорируются.
Альтернативно, если на строке указан только один символ, все экземпляры этого символа будут удалены; это полезно в языках, где ударения представлены отдельными символами.
На самом деле, каждый “символ” может быть любой строкой, не содержащей пробелов, поэтому словари
unaccent
могут использоваться для других видов замены подстрок, помимо удаления диакритических знаков.Как и другие файлы конфигурации текстового поиска в Tantor BE, файл правил должен быть сохранен в кодировке UTF-8. Данные автоматически переводятся в кодировку текущей базы данных при загрузке. Линии, содержащие непереводимые символы, молча игнорируются, так что файлы правил могут содержать правила, которые не применимы в текущей кодировке.
Более полный пример, который непосредственно полезен для большинства европейских языков, можно найти в файле unaccent.rules
, который устанавливается в $SHAREDIR/tsearch_data/
при установке модуля unaccent
. Этот файл правил преобразует символы с акцентами в те же символы без акцентов, а также разворачивает лигатуры в эквивалентную последовательность простых символов (например, Æ в AE).
F.59.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.59.3. Функции #
Функция unaccent()
удаляет ударения (диакритические знаки) из
заданной строки. По сути, это обертка вокруг
словарей типа unaccent
, но ее можно использовать вне обычных
контекстов текстового поиска.
unaccent([dictionary
regdictionary
, ]string
text
) returnstext
Если аргумент dictionary
не указан, используется текстовый поисковый словарь с именем unaccent
, находящийся в той же схеме, что и сама функция unaccent()
.
Например:
SELECT unaccent('unaccent', 'Hôtel'); SELECT unaccent('Hôtel');