Функция для Laravel: понимаем ошибки пользователей
Недавно мы запустили сервисcardabra.ru. Это такое место, где пользователи делятся скидками друг с другом, и экономят на покупках в известных брендовых магазинах. В базе присутствует огромное количество названий различных брендов, и это создает определенные трудности. Об этом ниже.
Для того, чтобы пользователю было удобно, магазины необходимо хранить у себя в базе, чтобы пользователи могли под единым названием добавлять туда свои скидки, потому что если один человек напишет UNI QLO, второй напишет Уникло, а третий напишет Уни Кло – мы получим три разных магазина, а нужно, чтобы он был один. Ну и, разумеется, корректно записан, как действительно звучит название бренда:
Для решения этой задачи мы написали PHP функцию для Laravel, которая автоматически ищет синонимы и опечатки, вводимые пользователем, и сопоставляет это дело с базой данных, где хранится массив данных о брендах и магазинах. Например, если использовать слово "jack" и все возможные варианты транслитерации, которые указали в словаре:
$dic = [
'a' =>['а','э'],
'c' =>['ц','к'],
'j' =>['ж','дж'],
'k' =>['к'],
'ck'=>['к'],
];
то на выходе мы получаем:
джaк, жaк, джaцк, жакк, жэкк, джакк, джэкк, жаск, жэск, джаск, джэск, жэк, джэк
Все это используем в Searchable trait, размещая полученные синонимы для каждого бренда в отдельную колонку. Подключаем асинхронный поиск (мы использовали select2) с выводом подсказок.
Для нашей задачи этого было вполне достаточно, чтобы сгенерировать максимальное число возможных коверканий брендов.
Кому надо – делимся наgithub (as it is).