Я реализовал эту функциональность на своем сайте. В основном у меня есть HTML-форма, где пользователь может запросить:
<form method="post" action="[_LINK_HELP_SEARCH_]">
<div class="static-text">(_INTRO_)</div>
<input class="inline" name="q" id="search" type="text" value="[_QUERY_]" />
<input class="inline" type="submit" value="(_SEARCH_)" />
<div class="micro-text">(_EXAMPLE_)</div>
</form>
Примечание. Все [XXX] и (YYY) являются полями шаблона, вы должны заменить их в своем коде.
Когда форма отправляется, PHP-файл разбивает запрос на слова:
$query = preg_replace('/\s{2,}/', ' ', $query);
$words = explode(' ', $query);
Поиск каждого файла в целевой папке (
$help_files = _get_all_files('help');
$help_files = array_slice($help_files, 0, MAX_RESULTS);
foreach($help_files as $file) {
Обратите внимание, что я ищу только в папке 'help', вы должны адаптировать ее к своим потребностям. Также обратите внимание, что _get_all_files - это пользовательская функция, которая просто выводит список всех файлов PHP в данной папке.
Затем загрузите и проанализируйте текст:
$text_file = '';
$filename = $file['page'];
if (_file_exists($filename)) {
$text_file = _read_php_file($filename);
}
$text_file = strtolower($text_file);
$text_file = strip_tags($text_file);
$text_file = preg_replace('/\[_(.*?)_\]/', '...', $text_file);
$text_file = preg_replace(array('/\s{2,}/', '[\t\n]'), ' ', $text_file);
Обратите внимание, что _read_php_file читает файл содержимого PHP, то есть то же самое, что пользователь получит, если он вызовет этот файл. Это потому, что я использую шаблоны, а мои HTML-файлы не являются прямыми. Если вы используете статический HTML, вы можете использовать readfile () или аналогичный.
Далее, слова для поиска:
$score = 0;
foreach ($words as $word) {
if (strpos($text_file, $word) !== false) {
$score++;
}
}
Я знаю, что это можно оптимизировать, но на данный момент в этом нет необходимости. По сути, этот фрагмент кода считает каждое слово, найденное в тексте, и получает оценку .
Далее вас может заинтересовать создание отрывка текста:
$pos = strpos($text_file, $words[0]);
$cut_ini = max($pos - RESUME_LIMIT/2, 0);
$extract = substr($text_file, $cut_ini, RESUME_LIMIT);
$extract = "...$extract...";
И, наконец, я храню всю эту информацию в выходном массиве (для каждого найденного файла), если оценка имеет значение:
if (($score > 0) && (count($words) / $score > 0.7)) {
$result = array (
'extract' => $extract,
'title' => $file['title'],
'link' => $file['page'],
'score' => $score
);
$results[] = $result;
}
Конечно, все это нужно повторить для каждого файла, который вы хотите проиндексировать, и в конце вы должны отсортировать массив:
usort($results, "_search_sort");
С помощью этой функции:
function _search_sort($a, $b) {
if ($a['score'] == $b['score']) {
return 0;
}
return ($a['score'] > $b['score']) ? -1 : 1;
}
В конце у вас будет отсортированный массив с результатами поиска. Надеюсь, это поможет.