Перейти к основному содержимому

unaccent — словарь полнотекстового поиска, удаляющий диакритические знаки

примечание

Эта страница переведена при помощи нейросети GigaChat.

Unaccent — это специальный фильтр-диалект для полнотекстового поиска, предназначенный для удаления диакритических знаков (акцентов) из ключевых слов. Его особенность в том, что обработанные слова передаются дальше другим фильтрам (словарям), а не обрабатываются самостоятельно. Таким образом, это позволяет проводить полнотекстовый поиск без учета наличия или отсутствия акцентов в словах.

Однако на сегодняшний день unaccent нельзя использовать в качестве фильтра нормализации для тезаурусных словарей (thesaurus).

Данный модуль помечен как «доверенный», что значит, что он доступен для установки любым пользователям, имеющим право создавать объекты в текущей базе данных (привилегия CREATE).

Конфигурация

Словарь принимает единственный параметр:

RULES — имя файла, содержащего правила конвертации символов. Файл хранится в каталоге общего назначения установочного набора PostgreSQL ($SHAREDIR/tsearch_data/), и его имя обязательно должно оканчиваться расширением .rules. Само расширение не указывается в значении параметра RULES. Формат файла с правилами следующий:

Каждая строка соответствует одному правилу замены символа. Правило записано в следующем виде: сначала идет символ с акцентом, затем следуют пробелы, а потом сам символ без акцента. Во время обработки символы с акцентами заменяются на соответствующие аналоги без акцентов.

Пример фрагмента файла с правилами:

À        A
Á A
 A
à A
Ä A
Å A
Æ AE

Правила unaccent предполагают следующую структуру:

  • Каждый символ, подлежащий замене, отделяется от соответствующего ему символа (без акцента) ровно одним пробелом. Пробелы слева и справа от строки игнорируются.

  • Альтернативный вариант: если указана только одна одиночная литера, то все ее экземпляры будут полностью удалены из текста. Такой способ удобен для случаев, когда акценты представляют собой отдельные символы (например, надстрочные точки или крючки).

  • Важно понимать, что термин «символ» здесь весьма условен: на практике любая комбинация букв, чисел или иных знаков, не содержащих пробелов, может выступать как «символ». Поэтому словарь unaccent способен решать задачи не только по удалению диакритик, но и по выполнению широкого спектра операций по замене подстрок.

  • Некоторые символы, например числовые символы, могут требовать наличия пробелов в их правиле преобразования. В этом случае можно использовать двойные кавычки вокруг символов преобразования. Двойная кавычка должна экранироваться второй двойной кавычкой при включении ее в преобразуемый символ. Например:

    ¼      " 1/4"
    ½ " 1/2"
    ¾ " 3/4"
    “ """"
    ” """"
  • Все файлы конфигурации полнотекстового поиска PostgreSQL сохраняются исключительно в кодировке UTF-8. Когда база данных загружает такой файл, его содержимое автоматически перекодируется в текущую кодовую страницу базы данных. Если обнаруживаются строки с ошибочными символами, они молча отбрасываются без вывода ошибок, чтобы обеспечить максимальную гибкость правил для различных кодировок.

Для демонстрации практической пользы, наиболее подробный пример находится в файле unaccent.rules, устанавливаемом вместе с модулем unaccent в директорию $SHAREDIR/tsearch_data/. В нем приведены правила перевода символов с акцентами в обычные буквы и разложения сложных графем (лигатур) на комбинации обычных символов (например, замена символа «Æ» на пару «A» и «E»).

Такой подход позволяет эффективно обрабатывать запросы на большинстве европейских языков, обеспечивая полноценную работоспособность полнотекстовых поисковиков без влияния диакритических знаков.

Использование

Установленное расширение unaccent создает шаблон полнотекстового поиска unaccent и одноименный словарь, настроенный по умолчанию на использование стандартных правил (RULES='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)

Функции

Функция unaccent() удаляет диакритические знаки из заданной строки. По сути, это обертка вокруг словарей типа unaccent, но она может использоваться вне обычного контекста поиска текста.

unaccent([dictionary regdictionary, ] string text) returns text

Если аргумент dictionary опущен, используется словарь для поиска текста с именем unaccent и находящийся в той же схеме, что и сама функция unaccent().

Например:

SELECT unaccent('unaccent', 'Hôtel');
SELECT unaccent('Hôtel');