@lookingfor2

Как правильно сделать запрос с поиском текста?

Суть в том что в строке запроса может быть аббревиатура, или что то лишнее.
Из примера ниже видно, что запись не найдет.
Пример:
create table banks(
  id serial,
  name text
);

insert into banks(name) values('Тиньков'),('Сбербанк'),('Альфа Банк');
select * from banks where name ilike '%ПАО СБЕРБАНК%';

https://sqlize.online/s/F
  • Вопрос задан
  • 66 просмотров
Решения вопроса 3
@mayton2019
Bigdata Engineer
По всем ответам - согласен. Добавлю. В данной постановке точный поиск вообще не работает. Но работает fuzzy - поиск с использованием триграмм. Триграммы - это тройки букв которые должны максимально близко совпасть у шаблона и искомой строки. Чем их больше - тем выше similarity. Похожесть типа.

Вобщем делайте поиск где SIMILARITY > 0.5 или какой-то любой величины. И выводите пользователю строки-кандидаты в порядке ранга похожести. И пускай он сам выбирает.

Для скорости - стройте триграм-индекс. Вот тут для начала почитайте https://www.postgresql.org/docs/current/pgtrgm.html
Ответ написан
Комментировать
@bacon
Общего решения для такого нет, сводиться к частным, например, до запроса чистить от левых слов, типа "ПАО". Еще варианты, возможно может помочь fulltext search, но тогда тут нужны будут синонимы типа "Альфа Банк"-"АльфаБанк" и "Тиньков"-"Тинькофф". Или fuzzystrmatch.
Ответ написан
Комментировать
@Akina
Сетевой и системный админ, SQL-программист.
Видимый выход - парсить запрос на токены, запрашивать по каждому токену, отбирать записи с хотя бы одним вхождением, сортировать по количеству вхождений (или, например, по суммарной длине найденных токенов).
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы