Я пытаюсь создать базовую функцию поиска для MySQL InnoDB. Я знаю, что есть полнотекстовый поиск, но сейчас я просто хочу сделать легкое и простое решение. Я хочу, чтобы при поиске пользователя, например, "BMW Car", я хочу найти результаты не только как "BMW Car", но и "Автомобиль BMW", "BMW Z4 Car" и т.д. Есть ли простой способ сделать это? Как бы вы реализовали такой поиск?
Сейчас я использую LIKE:
SELECT title,id FROM table WHERE title LIKE '%BMW Car%'
Но это не даст мне результатов, таких как "Автомобиль BMW" "BMW Z4 Car"..
Вы можете работать с двумя LIKE:
SELECT title,id FROM table WHERE title LIKE '%BMW%' AND title LIKE '%Car%'
Если бы не была необходимо изменить конфигурацию сервера на уменьшить минимальный размер ключевого слова от 4 до 3, чтобы соответствовать BMW
, Я бы сказал, что вам будет лучше полнотекстовый поиск в boolean mode с самого начала. Это гораздо более гибко:
SELECT title,id FROM table WHERE MATCH (title)
AGAINST ('+BMW +Car -Volvo' IN BOOLEAN MODE);
полнотекстовый поиск может также искать фразы:
SELECT title,id FROM table WHERE MATCH (title)
AGAINST ('+"BMW Z4" -"BMW Z3"' IN BOOLEAN MODE);
Вы должны изучить использование Lucene для таких функций поиска. Это все существование вращается вокруг поисковых документов. Вы получите идентификатор документа назад (который будет представлять ваши таблицы PK), а затем выберите из него БД, используя это.
Это займет некоторую предварительную обработку, чтобы разбить пользовательский ввод на слова. В php вы можете сделать:
$sql = "SELECT title,id FROM table WHERE " ;
$or = "" ;
$inputs = explode(" ", $_GET['q']) ;
foreach($inputs as $input) {
if(trim($input)=="") continue ;
$sql .= $or."title LIKE '%".sprintf("%s", mysql_real_escape_string($input))."%' " ;
$or = "OR " ;
}
$result = mysql_query($sql) ;
Посмотрите на логические операторы в MySQL: http://dev.mysql.com/doc/refman/5.1/en/logical-operators.html
# Title must contain either "bmw" or "car"
SELECT title, id FROM table WHERE title LIKE '%bmw%' OR title LIKE '%car%'
#Title must contain both "bmw" and "car"
SELECT title, id FROM table WHERE title LIKE '%bmw%' AND title LIKE '%car%'