У меня есть хорошая, легкая поисковая система, работающая на одном из моих сайтов с использованием полнотекстовых индексов MySQL и php для анализа результатов. Работа прекрасна, но я бы хотел предложить более «google-like» результаты с фрагментами текста из результатов и выделенными словами. Ищете решение на основе php. Любые рекомендации?
Поиск фактической базы данных прекрасен, пока вы не захотите добавить такие захватывающие функции, как выше. По моему опыту лучше создать специальную таблицу поиска с ключевыми словами и идентификаторами страниц / URL-адресами / и т. Д. Затем заполняйте эту таблицу каждые n часов содержимым. Во время этой совокупности вы можете добавлять фрагменты для каждого документа для каждого ключевого слова.
Альтернативно, быстрый взлом может быть:
<?php $text = 'This is an example text page with content. It could be red, green or blue.'; $keyword = 'red'; $size = 5; // size of snippet either side of keyword $snippet = '...'.substr($text, strpos($text, $keyword) - $size, strpos($text, $keyword) + sizeof($keyword) + $size).'...'; $snippet = str_replace($keyword, '<strong>'.$keyword.'</strong>', $snippet); echo $snippet; ?>
Для MySQL наилучшим выбором было бы сначала разделить ваши слова запроса, очистить ваши значения и затем объединить все в хорошее регулярное выражение.
Чтобы выделить ваши результаты, вы можете использовать <strong>
. Его использование будет семантическим, поскольку вы уделяете особое внимание предмету.
// Done ONCE per page load: $search = "Hello World"; //Remove the quotes and stop words $search = str_ireplace(array('"', 'and', 'or'), array('', '', ''), $search); // Get the words array $words = explode(' ', $search); // Clean the array, remove duplicates, etc. function remove_empty_values($value) { return trim($value) != ''; } function regex_escape(&$value) { $value = preg_quote($value, '/'); } $words = array_filter($words, 'remove_empty_values'); $words = array_unique($words); array_walk($words, 'regex_escape'); $regex = '/(' . implode('|', $words) . ')/gi'; // Done FOR EACH result $result = "Something something hello there yes world fun nice"; $highlighted = preg_replace($regex, '<strong>$0</strong>', $result);
Если вы используете PostgreSQL, вы можете просто использовать встроенную ts_headline
как описано в документации .
используйте preg_replace()
(или аналогичную функцию) и замените строку поиска на выделенный текст. например
$highlighted_text = preg_replace("/$search/", "<span class='highlighted'>$search</span>", $full_text);
На более крупном сайте я бы подумал, что с помощью javascript что-то вроде jquery будет способом пойти