Схожесть строк utf-8 в postgresql 10.1

ufk спросил: 03 ноября 2018 в 09:18 в: string

:) Я пытаюсь найти сходство строк в PostgreSQL 10.1.

Я использую расширения unaccent и pg_trgm и включаю их с помощью:

create extension unaccent;
create extension pg_trgm;

Проблема в том, что pg_trgm не обеспечивает поддержку utf8. Поэтому, если я выполню:

select similarity('כפיר','כפיר');

, он вернет нулевое подобие.

Я решил преобразовать эту строку в кодировку iso-8859-8, которая поддерживает Иврит и английский, языки, которые я использую в этом случае.

Но сначала я хочу unaccent строку, поэтому, если у меня есть כפיר - ƒ, сначала она будет преобразуется в כפיר - f, поэтому он будет надлежащим образом преобразован в требуемую кодировку символов.

Поэтому select unaccent('כפיר - ƒ'); возвращает правильные результаты.

Итак к сожалению, выполняется:

select convert(unaccent('כפיר - ƒ'),'UTF8','ISO_8859_8');

возвращает

[42883] ОШИБКА: функция преобразования (текст, неизвестный, неизвестный) не существует Подсказка: функция не соответствует данное имя и тип аргумента. Возможно, вам понадобится добавить явное приведение типов. Позиция: 8

Когда я проверяю документацию по адресу https://www.postgresql.org/docs/9.1/functions-string.html относительно функции convert(), для которой она требуется строка.

Если я пытаюсь преобразовать что-либо в строку, я получаю type "string" does not exist

ОК. Поэтому работа с unaccent - это первая проблема, которую мне нужно решить (и, возможно, единственная проблема). То, что я сделал дальше, вернуло правильные результаты, и я не увидел правильную строку на иврите.

Я имею в виду следующее ..

Выполнение select convert('כפיר','UTF-8','ISO_8859_8'); возвращает

4 B 00000000  EB F4 E9 F8                                        ëôéø

и приведение его к тексту с помощью select convert('כפיר','UTF8','ISO_8859_8')::text; возвращает \xebf4e9f8

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

Так что, если я не использую accent и выполняю:

select similarity(convert('כפייר עזר','UTF8','ISO_8859_8')::text, convert('כפיר','UTF8','ISO_8859_8')::text);

он возвращает сходство 0,5, что нормально.

Подводя итог, я задаю следующие вопросы:

  1. Как правильно привести unaccent, чтобы использовать его в convert
  2. Правильно ли я приводил свою строку иврита utf-8 в ASCII?
  3. Пытаюсь ли я решить проблему правильным способом - есть ли другое расширение для функции подобия, которая поддерживает utf-8?
  4. Я также хочу удалить любой символ, который не является буквенно-цифровым, из строки, прежде чем я выполню функцию подобия, чтобы получить лучшие результаты сходства, основанные на моих потребностях. Я думаю об использовании регулярных выражений о преобразовании строки в ASCII. что-то вроде: regexp_replace('string', '\W+', '', 'g'). Это путь? Есть ли regexp_replace, которое поддерживает utf8?

Спасибо!

0 ответов