我正在寻找 Google CSE 的免费、易于实施且无广告的替代品。
我找到了 indextank,它看起来是一种很简单的内容索引方法,但它不会抓取您的网站。我想我设想能够将 url ala Google CSE 传递给它。
因此,有没有一种简单的方法可以设置一个 PHP 脚本来执行爬取部分?即向它传递一个 URL 并让它索引该域上的所有网页。
最终结果是我可以在我的网站上进行网站搜索。
我正在寻找 Google CSE 的免费、易于实施且无广告的替代品。
我找到了 indextank,它看起来是一种很简单的内容索引方法,但它不会抓取您的网站。我想我设想能够将 url ala Google CSE 传递给它。
因此,有没有一种简单的方法可以设置一个 PHP 脚本来执行爬取部分?即向它传递一个 URL 并让它索引该域上的所有网页。
最终结果是我可以在我的网站上进行网站搜索。
我在我的网站中实现了这个功能。基本上我有一个 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) {
请注意,我只搜索“帮助”文件夹,您应该根据自己的需要进行调整。另请注意,_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;
}
最后,您将获得一个带有搜索结果的排序数组。我希望这有帮助。