2017-06-01 81 views
0

有一個靜態的舊網站,在HTML上有50頁。問題是如何實現一個不太快的搜索?哪種方式看?我也做了一個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); 
} 

?> 

回答

0

這不是你要通過在運行時運行的腳本來解決的問題。

你會想要一些東西預先解析成一個東西可以快速搜索。

一個簡單的方法是將其全部解析爲文本或JSON文件。然後你可以加載這個文本文件,搜索你的字符串,然後相應地處理它。

更優雅的方法是使用SQL數據庫(MySQL,SQLite,SQL Server等)或NoSQL數據庫(Mongo,Cassandra等)來存儲信息,然後對其運行查詢。

雖然最好的解決方案可能是使用Solr來允許正確的搜索。它會給出最好的結果(以及很多微調),但可能會滿足您的需求。

1

爲加快搜索最好的辦法是:

解析所有DOM解析器文件並提取內容。

寫這個內容在SQLite數據庫(只有50頁,你鴕鳥政策需要MYSQL)

然後用簡單的SQL,語句組織實時搜索。