Intereting Posts
Долгоживущие соединения (асинхронный серверный push) с Apache / PHP / Javascript? Кодовая кодировка CodeIgniter и поддержка UTF-8 Размещение события на стене страницы с PHP – правильная страница? Быстрая ошибка почтовой программы 'Swift_RfcComplianceException' в электронной почте, которая действительно работает? Модульное тестирование контроллеров Laravel Максимальное время выполнения в phpMyadmin preg_replace null с конкретными данными ORDER BY на MySQL хранимой функции в CakePHP 3 paypal parameater для создания повторяющегося профиля дает ошибку, пожалуйста, помогите мне Не удалось получить опубликованный массив из jQuery simplexml_load_file – избыточный элемент с пустым значением преобразуется в новый объект SimpleXMLElement как изменить размер SVG с помощью Imagick / ImageMagick Разделитель регулярных выражений PHP, в чем смысл? Выполнить сценарий оболочки в фоновом режиме, пока страница отображается на экране пользователю в php PDO bindParam против выполнения

Рекомендации по отображению результатов поиска с соответствующими фрагментами текста из фактического результата

У меня есть хорошая, легкая поисковая система, работающая на одном из моих сайтов с использованием полнотекстовых индексов 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 будет способом пойти