@lemonlimelike

Как сделать поиск по ключевым словам?

Вот у меня есть обычный поиск, где нужно писать полностью название, а как сделать чтоб поиск шел по ключевым словам, т.е. водишь какое либо слово и выводятся все видео в котором есть это слово?
if (isset($_POST['search'])) {
    $word = mysql_real_escape_string($_POST['search']);
    $result = mysqli_query($connection, "SELECT * FROM videos WHERE title LIKE '%$word%'");
    $end_result = '';

    $ter = array();
    while($row = mysqli_fetch_array($result)){
      $ter[] = $row;
    }
   foreach($ter as $r)
    {
        $result = $r;
        // выделим найденные слова
        $bold = '<span class="found" style="color:red;">' . $word . '</span>';
        $end_result .= '<li>' . str_ireplace($word, $bold, $result) . '</li>';
    }
    
}
  • Вопрос задан
  • 3282 просмотра
Решения вопроса 2
Exploding
@Exploding
wtf?
Для этого используйте конструкцию MATCH AGAINST. В мануалах там много про это есть.
Самые главные преимущества перед LIKE:
- поиск происходит не просто по тексту как с лайком, а по индексированным данным, что намного быстрее!
- опять таки поскольку данные индексированы, поиск умеет определять коэффициент релевантности(!), не плохо как для голого мускула, правда?)) И результат соответственно можно отсортировать по релевантности, что очень удобно по сравнению с лайком...
Нюансы кратко:
- для полей по которым будет осуществляться поиск должны быть определены полнотекстовые индексы
- такой поиск не может искать вхождения в середине слова (не фразы, а именно слова!!!). Да в принципе это очень редко встречается на практике.
Но зато поиск будет работать гораздо быстрее чем с LIKE!
Чтобы искать например фразу "дохлые мыши не едят зерно" по словам, надо сделать такое:
- фразу загоняем в массив по пробелу: $request = explode(" ", $req_array);
- из массива удаляем заранее определенные части речи типа союзов, местоимений и т.д.
хотя и не обязательно т.к. MATCH AGAINST игнорит слова 3 и менее символов, но подсознание подлое)), а и еще ж знаки препинания убрать, мало ли...
И потом это все дело опять в строку $to_query = implode(" ", $request);
И в запрос:
select * from `table` WHERE MATCH (`myfield1`, `myfield2`) AGAINST ('$to_query' IN BOOLEAN MODE)

И еще можно сортировку по релевантности состряпать изменив немного запрос:
select *, MATCH (`myfield1`, `myfield2`) AGAINST ('$to_query' IN BOOLEAN MODE) as `score` from `table` WHERE MATCH (`myfield1`, `myfield2`) AGAINST ('$to_query' IN BOOLEAN MODE) order by `score` desc

В итоге мы сможем найти фразу наподобие: "зерновые культуры и мыши - друзья, но если мыши дохлые" по трем словам.
Заметьте, что ставить "%srch_str%" или "*srch_str*" не нужно!!! СУБД понимает все.
Вот как бы такой он поиск. Но еще я прикручивал phpmorphy для того чтобы вытягивать словоформы для каждого слова, тогда можно будет найти фразу типа: "зерна постоянно смеются над дохлыми мышами"
Вроде бы все:)
А, нет, не все. Еще можно помимо LIKE использовать RLIKE.
Для этого наш последний массив слов пихаем в строку, но только вот так:
$to_query = implode("|", $request);
И в запрос: select * from `table` WHERE `myfield1` RLIKE '$request' or `myfield2` RLIKE '$request'
Как бы те же яйца, что и с LIKE но немного удобнее формировать сам запрос.
Ответ написан
Комментировать
djQuery
@djQuery
"Кодируем помаленьку" ("Сказка о Тройке")))
Конструкция
LIKE '%$word%'
как раз и подразумевает такой поиск...
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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