Как сделать полнотекстовый поисковик с php и mysql?

Я создал поисковую систему php, используя открытый исходный код. Я создал базу данных и таблицу с 5 столбцами:

название, описание, ключевые слова, ссылка, дата

Код, который я использую, представляет собой код php ниже:

<?php
    $keywords = $_GET ['input'];        
     $keywords = "Led Zeppelin";
$words = explode(" ",$keyword);

foreach ($words as $w) {
    $keyword_parts .= "+" . $w ." ";
}
$keyword_parts = substr($keyword_parts,0,-1);
$query = "SELECT
          *,
          MATCH (keywords,title) AGAINST ('" . $keywords . "') as score
          FROM search
          WHERE MATCH (keywords,title) AGAINST ('" . $keyword_parts . "' IN BOOLEAN MODE)
          ORDER BY score DESC";

    //connect
    mysql_connect ("localhost", "root", "password");
    mysql_select_db("intranet");

    $query = mysql_query($query);
    $numrows = mysql_num_rows ($query);
    if($numrows >0){
        while ($row = mysql_fetch_assoc($query)){
            $id = $row ['id'];
            $title = $row ['title'];
            $description = $row ['description'];
            $keywords = $row ['keywords'];
            $link = $row ['link'];
            $date = $row ['date'];

            echo "<h2><a href='$link'>$title</a><h2/>
            $description <br /><br />";
        }
    }
    else 
        echo "No results found for \"<b>$each</b>\" ";

    //disconnect
    mysql_close();
?>

Сценарий поиска работает нормально, но единственная проблема заключается в том, что он ищет по ключевому слову, что увеличивает результат поиска, но затрудняет поиск того, что вы хотите, потому что многие ключевые слова в разных записях совпадают.

Теперь я читал в Интернете о полнотекстовом поиске («Полнотекстовый поиск выполняется с использованием синтаксиса MATCH() ... AGAINST. MATCH()»), но я не знаю, как применить это к моему коду.


person buggytuf    schedule 20.07.2015    source источник
comment
Я протестировал некоторые вещи здесь: stackoverflow.com/questions/30677087/ сослался на то, что сделал Спенсер на естественном языке, в ссылке на него, а затем отказался от надежного solr   -  person Drew    schedule 20.07.2015
comment
Я видел это, но моя проблема заключается в реализации этого в моем коде, который я вставил выше. Если бы вы могли обернуть эту функцию вокруг моего кода, я был бы признателен. Спасибо   -  person buggytuf    schedule 20.07.2015
comment
как показал Роб, какой бы запрос вы ни выбрали, вставьте его в свою переменную $query. и бегите от функций mysql_*. Вместо этого перейдите к mysqli или pdo, если вы не хотите, чтобы пользователи якобы искали, а не удаляли ваши таблицы.   -  person Drew    schedule 20.07.2015
comment
Между прочим, похоже, что у него есть уязвимости SQL-инъекций - исправьте, прежде чем запускать!   -  person halfer    schedule 22.07.2015


Ответы (1)


Это то, что я использовал в прошлом. Кроме того, столбец, для которого вы выполняете ПОИСКПОЗ, должен быть изменен, чтобы разрешить ПОЛНЫЙ ТЕКСТ:

    $keyword = "Led Zeppelin";
    $words = explode(" ",$keyword);

    $keyword_parts = '';
    foreach ($words as $w) {
        $keyword_parts .= "+" . $w ." ";
    }
    $keyword_parts = substr($keyword_parts,0,-1);
    $query = "SELECT
              *,
              MATCH (column1,column2) AGAINST ('" . $keyword . "') as score
              FROM table
              WHERE MATCH (column1,column2) AGAINST ('" . $keyword_parts . "' IN BOOLEAN MODE)
              ORDER BY score DESC";
person Rob    schedule 20.07.2015
comment
Я изменил столбцы (ключевые слова и заголовок) и добавил их в предоставленный вами код, но теперь он даже ничего не находит. Я что-то упустил? - person buggytuf; 20.07.2015
comment
Кроме того, я считаю, что полнотекстовый поиск доступен только для таблиц MyISAM. - person Rob; 20.07.2015
comment
Да, я получаю. Результаты не найдены. Итак, для этого моя таблица должна быть MyISAM? - person buggytuf; 20.07.2015
comment
Я так думаю, но вы, возможно, захотите провести небольшое исследование заранее. Все мои таблицы полнотекстового поиска являются таблицами MyISAM. - person Rob; 20.07.2015
comment
Кроме того, вы получаете результаты, выполняя запрос без полного текста? - person Rob; 20.07.2015
comment
Теперь это мой код (думаю, я ошибся): <?php $keywords = $_GET ['input']; $keywords = "Led Zeppelin"; $words = explode(" ",$keyword); foreach ($words as $w) { $keyword_parts .= "+" . $w ." "; } $keyword_parts = substr($keyword_parts,0,-1); $query = "SELECT *, MATCH (keywords,title) AGAINST ('" . $keywords . "') as score FROM table WHERE MATCH (keywords,title) AGAINST ('" . $keyword_parts . "' IN BOOLEAN MODE) ORDER BY score DESC"; И он даже не получает ввод. - person buggytuf; 20.07.2015
comment
ОТ таблицы КУДА. Является ли таблица фактическим именем вашей таблицы? - person Rob; 20.07.2015
comment
нет, забыл поменять, но все равно не работает. Я ИЗМЕНИЛ КОД В МОЕМ ПОСТЕ, ТАК, КАК У МЕНЯ ЕГО СЕЙЧАС, ПОСМОТРИТЕ, ПРАВИЛЬНО ЛИ ЭТО, потому что я уверен, что что-то упустил. Спасибо - person buggytuf; 22.07.2015
comment
после ввода ввода получаю: No results found for: "" - person buggytuf; 23.07.2015
comment
Хорошее решение. Там было написано Undefined variable: keyword_parts, пока я его не отредактировал. Также зачем использовать $keyword, а не $keyword_parts в части «как оценка»? - person jscripter; 13.03.2016