01
Июн
2017

Как сделать поиск по статичному сайту?

Есть статичный старый сайт, с кучами страниц сделанных на html. Вопрос в том как реализовать более менее быстрый поиск? В какую сторону смотреть? Так же сделал на php скрипт который просто ищет текст в файлах но работает ооочень медленно, мб есть какие то способы индексации страниц или что вроде того.

<?php

ini_set('max_execution_time', 900);

if(!isset($_GET['s'])) {
    die('You must define a search term!');
}

$search_in = array('html', 'htm');
$search_dir = '.';
$countWords = 15;

$files = list_files($search_dir);
$search_results = array();
foreach($files as $file){
    $contents = file_get_contents($file);
    preg_match_all("/\<p\>(.*)".$_GET['s']."(.*)\<\/p\>/i", $contents, $matches, PREG_SET_ORDER);
    foreach($matches as $match){
        $match[1] = trim_result($match[1]);
        $match[2] = trim_result($match[2], true);
        $match[1] .= '<span style="background: #ffff00;">';
        $match[2] = '</span>'.$match[2];

        preg_match("/\<title\>(.*)\<\/title\>/", $contents, $matches2);
        $search_results[] = array($file, $match[1].$_GET['s'].$match[2], $matches2[1]);
    }
}

?>

    <html>
    <head>
        <title>Search results</title>
    </head>
    <body>
    <?php foreach($search_results as $result) :?>
        <div>
            <h3><a href="<?php echo $result[0]; ?>"><?php echo $result[2]; ?></a></h3>
            <p><?php echo $result[1]; ?></p>
        </div>
    <?php endforeach; ?>
    </body>
    </html>

<?php
function list_files($dir){
    global $search_in;

    $result = array();
    if(is_dir($dir)){
        if($dh = opendir($dir)){
            while (($file = readdir($dh)) !== false) {
                if(!($file == '.' || $file == '..')){
                    $file = $dir.'/'.$file;
                    if(is_dir($file) && $file != './.' && $file != './..'){
                        $result = array_merge($result, list_files($file));
                    }
                    else if(!is_dir($file)){
                        if(in_array(get_file_extension($file), $search_in)){
                            $result[] = $file;
                        }
                    }
                }
            }
        }
    }
    return $result;
}

function get_file_extension($filename){
    $result = '';
    $parts = explode('.', $filename);
    if(is_array($parts) && count($parts) > 1){
        $result = end($parts);
    }
    return $result;
}

function trim_result($text, $start = false){
    $words = split(' ', strip_tags($text));
    if($start){
        $words = array_slice($words, 0, $countWords);
    }
    else{
        $start = count($words) - $countWords;
        $words = array_slice($words, ($start < 0 ? 0 : $start), $countWords);
    }
    return implode(' ', $words);
}

?>

Источник: https://ru.stackoverflow.com/questions/673828/%D0%9A%D0%B0%D0%BA-%D1%81%D0%B4%D0%B5%D0%BB%D0%B0%D1%82%D1%8C-%D0%BF%D0%BE%D0%B8%D1%81%D0%BA-%D0%BF%D0%BE-%D1%81%D1%82%D0%B0%D1%82%D0%B8%D1%87%D0%BD%D0%BE%D0%BC%D1%83-%D1%81%D0%B0%D0%B9%D1%82%D1%83

Share

Тебе может это понравится...