Поиск без учета регистра и диакритических знаков PostgreSQL

У меня есть таблица данных, и я хотел бы отфильтровать столбцы. Например, для поиска пользователя по его ФИО.

Однако я хотел бы позволить пользователю вводить поисковые фразы независимо от регистра и акцентов.

Итак, я проверил эти (и другие) источники и вопросы:

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

  • объединить case_insensitive и ignore_accents в одну сортировку
  • как разрешить поиск только по подстроке в таком WHERE (например, найти «Jóhn Doe» только по строке «joh»), поскольку недетерминированные сопоставления не поддерживают LIKE или регулярные выражения
  • какой индекс использовать

Буду очень признателен за любой совет, как наконец справиться с такой проблемой.

Спасибо!

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
27
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Создание нечувствительных к регистру и диакритическим знакам сопоставлений ICU довольно просто:

CREATE COLLATION english_ci_ai (
   PROVIDER = icu,
   DETERMINISTIC = FALSE,
   LOCALE = "en-US-u-ks-level1"
);

Или, что то же самое (этот синтаксис также работает со старыми версиями ICU:

CREATE COLLATION english_ci_ai (
   PROVIDER = icu,
   DETERMINISTIC = FALSE,
   LOCALE = "en-US@colStrength=primary"
);

См. подробности в документация по отделению интенсивной терапии и подробное обсуждение в моя статья.

Но ваша проблема в том, что вы хотите искать подстроку. Таким образом, вы должны создать индекс триграммы:

CREATE EXTENSION IF NOT EXISTS pg_trgm;
CREATE EXTENSION IF NOT EXISTS unaccent;

CREATE INDEX ON tab USING gin (unaccent(doc) gin_trgm_ops);

Тогда вы можете искать так:

SELECT * FROM tab
WHERE unaccent(doc) ILIKE unaccent('%joh%');

Обратите внимание, что вы должны принудительно установить минимальную длину 4 или около того в строке поиска, если хотите, чтобы это было эффективно.

Спасибо, ваша статья помогла мне понять, как работает создание пользовательской сортировки ICU. Однако, к сожалению, моя проблема с невозможностью поиска с помощью недетерминированного ICU по части строки сохраняется.

Lunack 29.03.2022 17:10

Спасибо за обновление, я думал, что мне придется придерживаться этого решения без акцента. Мне просто нужно создать IMMUTABLE версию unaccent, как указано в моей первой ссылке. Благодарю вас!

Lunack 29.03.2022 20:56

Другие вопросы по теме