Как сделать поиск соответствием, даже если искомая строка не является точной в Mysql - PullRequest
0 голосов
/ 05 декабря 2018

Я привык работать с Postgres.С postgres я смог сделать более «интеллектуальный поиск», установив расширение триграммы pg_trgm , и тогда пользователь мог пропустить букву типа «aple» или расположить буквы неправильно «appel», что поиск будет соответствовать,С Mysql я не знаю, какую функцию использовать.Я могу кому-нибудь дать направление?

Мой запрос такой:

   select *,
   case when titulo like '%pneu%' then 1 else 0  end as rank_titulo,
    case when descricao like '%pneu%' then 1 else 0  end as  rank_descricao,
  case when tag like '%pneu%' then 1 else 0 end as rank_tag
   from produto where  titulo like '%pneu%'
   or descricao like '%pneu%' or 
  tag like '%pneu%' order by rank_titulo desc, rank_descricao desc, 
   rank_tag desc   ;

Мне все равно, если пользователь набрал "pineu", "pneo", "penu", которые ищутдолжно совпадать.

Мне не нужен рабочий код, который решает мою проблему, я просто хочу знать, какую функцию я должен использовать, некоторый демонстрационный код был бы оценен.

1 Ответ

0 голосов
/ 05 декабря 2018

Ближайшая особенность MySQL к расширению триграмм postgreSQL - FULLTEXT search .

Вы можете использовать этот синтаксис.

...WHERE MATCH(titulo, descricao, tag) AGAINST('pneu' IN NATURAL LANGUAGE MODE)...

Вам нужен индекс FULLTEXT в вашей таблице, чтобы это работало.

CREATE FULLTEXT INDEX ft ON produto(titulo, descricao, tag);

Остерегайтесь нескольких вещей: FULLTEXT по умолчанию работает только со словами из трех букв или более, а режим естественного языка работает странно на небольших таблицах.Вы можете изменить эти вещи.Вам также может понадобиться добавить stopwords на вашем языке (португальский?).

Также помните, что это часто работает нелогично.Вы можете спросить себя: «Почему он это сделал?»довольно часто.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...