@hesy

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

Добрый день.
Пытаюсь сделать поиск названия фильма в БД таким SQL-запросом:
// [name] => Проект засекречен / Проект «Синяя книга»
$connection->table('serials')
                  ->where('name', 'LIKE', '%синяя книга%')
                  ->get();

После выполнения результатов ноль.
НО, если оставить только "книга" он успешно найдёт. И снова НО, если вместо "книга" сделать запрос "синяя" - запрос опять ничего не вернёт.

У меня со sql совсем всё плохо, поэтому прошу подсказать, как оформить "поиск по названию", где, например, есть название "Касл-рок", а в поиск можно забить как "Каслрок"..
  • Вопрос задан
  • 166 просмотров
Решения вопроса 1
@hesy Автор вопроса
Спустя полдня, нашёл решение вопроса.
Сделал пользовательскую функцию для перевода строки в нижний регистр, так как lower() отказывался работать с кириллицей.

... 

function mb_lower($str) {
    return mb_strtolower($str);
}

// Если используется PDO:SQLite
$db->sqliteCreateFunction('mb_lower', 'mb_lower', 1);

// Если используется расшриение SQLite3 
// $db->createFunction('mb_lower', 'mb_lower');

$sql = 'SELECT name, season, episode FROM serials WHERE mb_lower(name) LIKE mb_lower("%хОдЯчиЕе МеРТВЕЦЫ%")';

...


Теперь всё работает как надо =)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Может проблема в регистре букв? Попробуйте поиск без учёта регистра и если заработает, используйте решение из ответа
https://stackoverflow.com/a/2876820
Ответ написан
dimonchik2013
@dimonchik2013
non progredi est regredi
выучи что такое % в запросе
тогда научишься составлять
'%синяя%книга%'
'синяя%книга%' - работает быстрее
'син%кни%' и т.д.

с Карслуэ сложнее - такое делается fuzzy matching и синонимами в системах полнотекстового поиска

и да - в Мускуль лучше использовать www.mysql.ru/docs/man/Fulltext_Search.html
Ответ написан
Ваш ответ на вопрос

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

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