docker
Новичок
Оптимальный алгоритм поиска
Добрый день!
Проблемма следующая. Как сделать единым запросом поиск по содержимому полей базы данных, чтобы он:
1) Искал каждое слово в каждом поле (с помощью LIKE)
2) После разделения слов, не искал всякие предлоги, типа "на", "под" и т.д. Т.е. не искал по слову исходного запрашиваемого текста, если оно меньше например 3 символов.
Первая аспект реализуется, например, так:
Исходная стока запроса разбивается на отдельные слова:
$array_query=explode(' ',$clear_query);
Затем в качестве разделителей добавляется уже синтаксис MySQL, чтобы напрямую вставлять это в текст запроса:
$in_mmenu=implode ("%' or LOWER(mmenu.name) like '%", $array_query);
$in_classes=implode ("%' or LOWER(classes.name) like '%", $array_query);
$in_instrums1=implode ("%' or LOWER(instrums.name) like '%", $array_query); и т.д.
И затем это вставляется в запрос:
$query.="WHERE (LOWER(mmenu.name) like '%".($in_mmenu)."%' OR ";
$query.="LOWER(classes.name) like '%".($in_classes)."%' OR ";
$query.="LOWER(instrums.name) like '%".($in_instrums1)."%' OR ";
$query.="LOWER(instrums.type) like '%".($in_instrums2)."%' OR ";
$query.="LOWER(instrums.purpose) like '%".($in_instrums3)."%')";
Но, вот здесь и возникает вторая проблемма. Например, если ищется что-то вроде "клапана для того-то с таким-то", то поиск будет реагировать на все эти предлоги "с", "для" - по всем указанным столбцам! А это не совсем корректная работа поиска.
Самое травиальное решение - из PHP убирать из массива $array_query все эти предлоги. Но ведь все не предусмотришь, да и то что вспомнишь - уже получится немало кода.
Как-то по иному можно это решить?
Спасибо
Добрый день!
Проблемма следующая. Как сделать единым запросом поиск по содержимому полей базы данных, чтобы он:
1) Искал каждое слово в каждом поле (с помощью LIKE)
2) После разделения слов, не искал всякие предлоги, типа "на", "под" и т.д. Т.е. не искал по слову исходного запрашиваемого текста, если оно меньше например 3 символов.
Первая аспект реализуется, например, так:
Исходная стока запроса разбивается на отдельные слова:
$array_query=explode(' ',$clear_query);
Затем в качестве разделителей добавляется уже синтаксис MySQL, чтобы напрямую вставлять это в текст запроса:
$in_mmenu=implode ("%' or LOWER(mmenu.name) like '%", $array_query);
$in_classes=implode ("%' or LOWER(classes.name) like '%", $array_query);
$in_instrums1=implode ("%' or LOWER(instrums.name) like '%", $array_query); и т.д.
И затем это вставляется в запрос:
$query.="WHERE (LOWER(mmenu.name) like '%".($in_mmenu)."%' OR ";
$query.="LOWER(classes.name) like '%".($in_classes)."%' OR ";
$query.="LOWER(instrums.name) like '%".($in_instrums1)."%' OR ";
$query.="LOWER(instrums.type) like '%".($in_instrums2)."%' OR ";
$query.="LOWER(instrums.purpose) like '%".($in_instrums3)."%')";
Но, вот здесь и возникает вторая проблемма. Например, если ищется что-то вроде "клапана для того-то с таким-то", то поиск будет реагировать на все эти предлоги "с", "для" - по всем указанным столбцам! А это не совсем корректная работа поиска.
Самое травиальное решение - из PHP убирать из массива $array_query все эти предлоги. Но ведь все не предусмотришь, да и то что вспомнишь - уже получится немало кода.
Как-то по иному можно это решить?
Спасибо