Организация релевантного поиска по базе данных
Делаю для себя сайт и параллельно изучаю PHP, MySQL. На одном из этапов появилась задача создать поиск по сайту. В моем случае пока только по одной таблице, таблице - страниц сайта (статические статьи). И я не до конца пока понимаю как это сделать лучше.
Исходные данные: В базе данных таблица называется pages с простой структурой "id | name | description" Запрос приходит в виде string переменной "searchquery" очищенной средствами php.
Первое что я придумал это входящий запрос searchquery вставлять в запрос к БД через LIKE % $searchquery %. Плюс: Работает Минус: Требуется хорошая фильтрация от атак и надо знать все страницы сайта чтобы их найти, иначе через поиск можно не найти нужную страницу.
Второе что пришло в голову это добавить к структуре таблицы колонку "Keywords" Но т.к. запрос от пользователя это некое предложение а ключевые слова в Keywords через запятую то LIKE тут не сработает.
Следующее что я сделал, на мой взгляд, имеет очень громоздкую структуру
Извлекаю все данные из БД:
$result = $db->query("SELECT id, name, description, keywords FROM pages"); $result->execute();
Записываю в массив:
$i=0;
while ($row = $result->fetch()) {
$searchList[$i]['id'] = $row['id'];
$searchList[$i]['url'] = $row['name'];
$searchList[$i]['description'] = $row['description'];
$searchList[$i]['keywords'] = $row['keywords'];
$i++;
}
- Добавляю новое поле в массив:
foreach ($searchList as &$sr) {
$sr['index'] = "0";
}
$count = count($searchList) - 1;
$i = 0;
- Сравниваю значения через функцию. Которая как я выяснил работает по алгоритму Оливера.
while ($i <= $count) {
$string = $searchList[$i]['keywords'];
$sim = similar_text($string, $searchquery, $perc);
$searchList[$i]['index'] = $sim;
$i++;
}
function compare ($v1, $v2) {
if ($v1["index"] == $v2["index"]) return 0;
return ($v1["index"] > $v2["index"])? -1: 1;
}
Сортирую
~ usort($searchList, "compare");~
И на удивление все работает, страницы сортируются в зависимости от запроса и вверху списка более подходящие страницы, но есть и исключения. Конкретно нужная страница порой находится на третьем месте (по статистике).
Как можно сделать поиск лучше?
PS. ключевые слова подбираются по частоте их использования в тексте, первые 15-25 слов из списка.