Два запроса mysql:
SELECT * FROM `table` WHERE `column` like '%текст%';
и
SELECT * FROM `table` WHERE MATCH (`column1`, `column2`) AGAINST ('текст');
Какой из них лучше использовать?
Если таблица будет содержать "MySQL — свободная система управления базами данных", то по запросу "свободная система" запись находит. А как сделать что-бы можно было найти, например, по такому запросу - "MySQL система управления базами"? То есть как сделать поиск "как в гугле"?
Примечание:
Не могу даже алгоритм составить, в этом основная проблема. Если бы алгоритм был, то "перевести" уже будет не проблема.
Примечание:
> Славный ты, думаешь поиск по базе так легко произвести?
Нет, если бы всё было просто, то я бы сделал и без подсказок.
> уже о таком гиганте.
Сравнение с гуглом было для лучшего понимания того, что нужно. Такой поиск есть на каждом сайте, а если это делают все значит сверх сложного тут ничего нет.
Понятно, что строку нужно разрезать на слова, но не представляю как потом составить запрос и что вообще с этими словами делать.
Примечание:
> просто подключите поиск Гугла по сайту и не заморачивайтесь
Глупо. Сейчас разберусь как это делается, а потом может смогу в других скриптах использовать.
> Лучше гугла все равно алгоритм не придумаете
А лучше мне и не надо.
Я зря наверно сотню баллов даю. Вы наверно думаете что написали ерунду и я выберу ваш ответ как лучший? Я ведь не прошу делать всё за меня, просто направление и больше мне ничего не нужно.
Примечание:
По-моему сделал дебильно, но работает :)
Вообще я борюсь за открытость разработок и по этому выкладываю его на общее пользование.
<?php
$dbpass="i'll not say :)"; // Пароль к БД
$db=mysql_connect("localhost", "root", $dbpass); // соединение с БД
mysql_select_db("bots", $db); // выбор БД
mysql_query("SET NAMES UTF8"); // Устанавливаем нужную кодировку (в mysql по дефолту кодировка latin1, а у пингвина UTF-8 и из-за этого поиск работает только с латиницей)
$message=$_POST['message']; // Принимаем строку от юзера
$mas=explode(" ", $message); // Разделяем её на слова. Словом считаем комбинацию символов между пробелами
$mas = array_unique($mas); // Удаляем повторяющиеся слова
$j=0;
$search = "SELECT * FROM `bot` WHERE `answer` like '%".$mas["$j"]."%'"; // Помещаем первую часть запроса в переменную
// Тут ничего сложного нету, кому надо разберётся :)
for($i=0, $count=count($mas); $i<$count-1; $i++){
$g=$i+1;
$search .= " OR '%".$mas["$g"]."%'";
$j++;
}
$get_results = mysql_query("$search"); // Посилаем запрос в БД
$results_number = mysql_numrows($get_results); // Узнаём сколько результатов найдено
if($results_number > 0){ // Если найдено больше ноля
// Выводим всё найденное
while ($arr=mysql_fetch_array($get_results)){
print $arr['question']."<br>";
}
}
else{
print "Ничего не найдено.";
}
?>
Если посмотрите на таблицу, поймёте, что делал бота. По этому и нужен был "поиск как в гугле" и комментарий "просто подключите поиск Гугла" мне никак не был бы полезен. Гугл не способен на такое, он мог бы найти только по сайту, а у меня другая цель. Да и вообще мне кажется, что даже использовать поиск по сайту с помощью поисковиков это не разумно. Зачем тогда вообще заниматься программированием, если не можешь ничего сделать самостоятельно.
Если кто-нибудь поправит скрипт, укажет на ошибки или ещё как-нибудь поможет - выберу его в качестве лучшего. За просто так сотню баллов никому не подарю.
Примечание:
UrsaMajor, спасибо за ответ, но так получается, что посылаешь запросы в БД несколько раз. А если фраза будет 50 слов? Нагрузка на сервер, время выполнения и много чего ещё. А если пользователей будет много, то количество запросов будет ещё больше. В общем, это не вариант. Лучше одной строкой, как у меня:
SELECT * FROM `bot` WHERE `answer` like '%бла-бла%' OR '%бла-бла...%';
Примечание:
Кстати у гугла наверно используется что-то подобное:
..WHERE MATCH (`column1`) AGAINST..
Примечание:
Ещё можно удалять слова короче 4-х символов и "бесполезные", то есть те которые для связки слов (а, и, или, как, это и тд).
Но это уже танцы с напильником, а я выложил каркас, который явно нуждается в доработке.