Запускает результат поиска в базе данных по нескольким ключевым словам

#php #mysql #html

#php #mysql #HTML

Вопрос:

У меня есть скрипт поиска на PHP, который выполняет поиск в базе данных MySQL для ответов на вопросы. В настоящее время моя база данных представлена следующим образом…

вопрос
id = который час
ответ = Время 12:00

Затем эти данные отправляются в мой PHP-код:

 <?php

mysql_connect("localhost","username","password");
mysql_select_db("database");

if(!empty($_GET['q'])){
$query=mysql_real_escape_string(trim($_GET['q']));
$searchSQL="SELECT * FROM questions WHERE `question` LIKE '%{$query}%'  LIMIT 1";
$searchResult=mysql_query($searchSQL);

while($row=mysql_fetch_assoc($searchResult)){
$results="{$row['answer']}";
}

echo $results;
}

?>
  

В настоящее время запрос пользователя должен содержать точно такой же текст, что и поле вопроса. Мой вопрос; как я могу заставить это работать, чтобы оно запускало определенное значение для нескольких ключевых слов?

Я надеюсь, вы сможете понять мой вопрос

Комментарии:

1. Не могли бы вы привести пример того, с какими ключевыми словами вы хотели бы сопоставить конкретный вопрос?

2. Я думаю, что такого рода обработка естественного языка выходит за рамки вопросов и ответов SO.

Ответ №1:

Я думаю, что полный индекс тестового поиска может помочьhttp://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html Функция SOUNDEX также может быть полезна в этом контексте. Вы можете разделить запрос на ключевые слова и сгенерировать динамический SQL, но это неэффективно (проблемы с производительностью при атаках с использованием SQL-инъекций) см.http://php.net/manual/en/function.split.php

Альтернативой является добавление таблицы QUESTION_KEYWORD (QUESTION_ID, КЛЮЧЕВОЕ СЛОВО), разделение вопроса и поиск по этой таблице, чтобы найти лучший QUESTION_ID, но полнотекстовый поиск по индексу более эффективен. Фактически индекс полнотекстового поиска использует аналогичную структуру данных для оптимизации тестового поиска.

Ответ №2:

Для простого быстрого исправления на основе вашего комментария вы могли бы сделать что-то столь же простое, как это:

 // Assuming query string is ?q=make,sponge,cake
$searchSQL="SELECT * FROM questions WHERE ";
$count = 0;
foreach (explode(',', $_GET['q']) as $query) {
  $searchSQL .= "`question` LIKE '%" .mysql_real_escape_string(trim($query)) . "%' ";
  if ($count   > 0) {
    $searchSQL .= ' OR ';
  }
}

$searchSQL .= ' LIMIT 1';
$searchResult = mysql_query($searchSQL);
  

Комментарии:

1. Вы могли бы просто обратить процесс вспять, т. Е. q=how,to,make,a,sponge,cake , если можно быть свободным в подборе (использовании OR ), тогда это сработало бы. Если вы хотите выборочный AND , то, боюсь, это больше похоже на обработку естественного языка, как указано выше