F.59. unaccent — словарь полнотекстового поиска, который удаляет диакритические знаки#

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) returns text

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

Например:

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