Простой поиск в MySql

0

Я пытаюсь создать базовую функцию поиска для 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"..

Теги:
select
search
innodb
sql-like

4 ответа

1

Вы можете работать с двумя 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);
  • 0
    Но не является ли полнотекстовый поиск MyIsam? Я использую InnoDB ..
  • 0
    @ Мартин, ты прав, конечно, я пропустил эту часть. Сожалею. FWIW, вот описание того, как Wikipedia, кажется, работает вокруг этого (весь поток там интересен). LIKE, кажется, действительно самый простой способ
Показать ещё 2 комментария
0

Вы должны изучить использование Lucene для таких функций поиска. Это все существование вращается вокруг поисковых документов. Вы получите идентификатор документа назад (который будет представлять ваши таблицы PK), а затем выберите из него БД, используя это.

0

Это займет некоторую предварительную обработку, чтобы разбить пользовательский ввод на слова. В 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) ;
0

Посмотрите на логические операторы в 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%'

Ещё вопросы

Сообщество Overcoder
Наверх
Меню