Итак, у вас полностью динамический сайт, на котором находится большое количество различных данных (любого вида – форумы, статьи и т.п.). Преимущественно большие данные хранятся в BLOBах (чего и вам наверное не удалось избежать), следовательно невозможно сделать ничего полезного, используя стандартный вид запроса LIKE %searchword% так как вывод не будет соответствующим (то есть релевантным).
Должен быть другой путь. И он есть :-).
Шаг один: Редукция "посторонних" слов из blob'а
Первая проблема заключается в том, что данные переполнены посторонними словами (предлогами, междометиями..), такими как "как, где, а, и". Эти слова помогают нам, людям, общаться но не имеют ничего общего с нашей проблемой, когда нужно получить вывод по релевантности.
Ниже, в конце статьи, я приложил мой личный список таких, "посторонних", слов.
Итак, мы сейчас пытаемся сделать – выбрать из данных эти слава, и, - в ново созданной табличке с двумя полями: словом и его указателем (счетчиком). Нам необходимо что-то вроде такого:
+-----+---------------+
| qid | word |
+-----+---------------+
| 6 | links |
| 5 | Fire |
| 5 | topics |
| 5 | related |
| 5 | Shakespeare |
| 4 | people |
| 4 | Knowpost |
| 3 | cuba |
| 3 | cigar |
+-----+---------------+
Так, давайте создадим собственно табличку:
CREATE TABLE search_table(
word VARCHAR(50),
qid INT)
Следующим шагом будет – обработать и переместить данные в нашу таблицу search_table.
<?php
$query = "SELECT blob,identifier FROM your_table";
$result = mysql_query($query);
$number = mysql_numrows($result);
$j = 0;
WHILE ($j < $number) {
/* Наш "blob" */
$body = mysql_result($result,$j,"blob");
/* Наш "identifier */
$qid = mysql_result($result,$j,"qid");
/* Открыть файл с посторонними словами в массив */
$noise_words = file("noisewords.txt");
$filtered = $body;
/* Помещаем пробел перед первым словом */
$filtered = ereg_replace("^"," ",$filtered);
/* Теперь мы избавились от ненужных слов и
можем поместить то, что осталось – в массив
*/
/* Пробегаем циклом и удаляем неправильные слова */
/* Пробежаться по циклу еще разок с новыми данными */
$j++;
}
?>
Этот скрипт обрабатывает ваши старые данные. Необходимо добавить подобную же обработку на добавление данных в вашу базу данных (когда её вводит пользователь, хозяин – или кто угодно) – так, чтобы база обновлялась в процессе.
Шаг два: Поиск в таблице
Теперь мы имеем таблицу с ключевыми словами и счетчиками. Как собрать запрос?
Во-первых, необходимо переформатировать (нет, не жесткий диск) – слова поиска в строку вида 'word1','word2','word3' и записать её в $querywords.
Далее использовать подобный ниже следующему запрос:
SELECT count(search_table.word) as score, search_table.qid,your_table.blob
FROM search_table,your_table
WHERE your_table.qid = search_table.qid AND search_table.word
IN($querywords)
GROUP BY search_table.qid
ORDER BY score DESC";
Вывод же может быть, например, таким:
<?php
$getresults = mysql_query($search);
$resultsnumber = mysql_numrows($getresults);
IF ($resultsnumber == 0) {
PRINT "Ничего не найдено. "
."Попробуйте использовать другие ключевые слова.";
Итак, у вас есть механизм поиска по ключевым словам в вашей базе данных по релевантности (актуальности запросу).
Конечно, это не Yandex и не Google :-))).
Но у нас теперь есть небольшой поисковый механизм, который вполне быстро и грамотно работает и вполне подходит обычному пользователю (который не собирается использовать логические элементы и т.п.).