PHP

Релевантный поиск в базе данных MySQL по нескольким словам

Как искать строку в нескольких полях? Когда пользователь ввёл одно слово в строке поиска, — это ясно делаем так:
$str = "слово";  // слово которое хочем найти
$result = $db->sql_query("SELECT * FROM base_markers WHERE title LIKE '%{$str}%' OR address LIKE '%{$str}%' ORDER BY title LIMIT 10");

А что делать если юзерь ввёл более одного слова и необходимо выполнить поиск по разным полям?

Вот решение:
$str = 'два слова';
 
$points = $where = array();
$fields = array('title', 'address');  // в каких полях будем искать фразу
$str = mysql_real_escape_string($str);
$words = explode(' ', str_replace(",", "", trim($str)));
// максимальное количество баллов за точное вхождение фразы
$max_points = count($words) * 1;
 
foreach ($fields as $field) {
  if (count($words) > 1) {
    $points[] = "IF ({$field} LIKE '%{$str}%', {$max_points}, 0)";
  }
  foreach ($words as $w) {
    if (!$w) continue;
    $where[] = "{$field} LIKE '%{$w}%'";
    $points[] = "IF ({$field} LIKE '%{$w}%', 1, 0)";
  }
}
 
$where = "(" . implode(' OR ', $where) . ")";
$points = implode(' + ', $points);
 
$result = $db->sql_query('SELECT *, (' . $points . ') AS points FROM base_markers ORDER BY points DESC LIMIT 20');
while($row = $db->sql_fetchassoc($result)){
  $output[] = $row;  // это наш массив в котором будут результаты поиска
}
Теги:
Релевантный поиск
Добавлено: 16 Сентября 2013 04:15:04 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...