unaccent

Модуль unaccent представляет собой словарь текстового поиска, убирающий надбуквенные (диакритические) знаки из лексем. Это фильтрующий словарь, что означает, что его выходные данные всегда передаются следующему словарю (если таковой имеется), что отличается от обычного поведения словарей. Это позволяет выполнять полнотекстовый поиск без учета знаков ударения (диакритик).

Текущую реализацию unaccent нельзя использовать в качестве нормализующего словаря для словаря thesaurus.

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


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

Словарь unaccent принимает следующие параметры:

  • Параметр RULES задает базовое имя файла, содержащего список правил преобразования. Этот файл должен храниться в каталоге $SHAREDIR/tsearch_data/ (где под $SHAREDIR подразумевается каталог с общими данными установки QHB). Имя файла должно заканчиваться расширением .rules (которое не нужно указывать в параметре RULES).

Файл правил имеет следующий формат:

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

    À        A
    Á        A
    Â        A
    Ã        A
    Ä        A
    Å        A
    Æ        AE
    

    Эти два символа должны разделяться пробелом, а любые начальные или конечные пробелы в строке игнорируются.

  • Как вариант, если в строке задан всего один символ, вхождения этого символа удаляются; это полезно в языках, где диакритики представляются отдельными символами.

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

  • Как и другие файлы конфигурации текстового поиска в QHB, файл правил должен храниться в кодировке UTF-8. При загрузке данные из него будут автоматически преобразованы в кодировку текущей базы данных. Все строки, содержащие непереводимые символы, молча игнорируются, поэтому файлы правил могут содержать правила, неприменимые в текущей кодировке.

Более полный экземпляр правил, непосредственно пригодный для большинства европейских языков, можно найти в файле unaccent.rules, который при установке модуля unaccent помещается в каталог $SHAREDIR/tsearch_data/. Этот файл правил преобразует символы с диакритиками в те же символы без диакритик, а также разворачивает лигатуры в равнозначные последовательности простых символов (например Æ в AE).


Применение

При установке расширения 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)

Функции

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

unaccent([словарь regdictionary, ] строка text) returns text

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

Например:

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