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([dictionaryregdictionary, ]stringtext) returnstext
Если аргумент dictionary не указан, используется текстовый поисковый словарь с именем unaccent, находящийся в той же схеме, что и сама функция unaccent().
Например:
SELECT unaccent('unaccent', 'Hôtel');
SELECT unaccent('Hôtel');