我正在寻找免费的易于实施的& Google CSE的无广告替代品。
我发现了indextank,它看起来像一种简单的索引内容的方式,但它不会抓取您的网站。我想我设想能够将它传递给Google CSE。
因此,有没有一种简单的方法可以设置PHP脚本来执行抓取部分?即传递一个URL并让它为该域上的所有网页编制索引。
最终结果是我可以在我的网站上进行网站搜索。
答案 0 :(得分:1)
我在我的网站中实现了此功能。基本上我有一个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;
}
最后,您将获得一个包含搜索结果的排序数组。我希望这会有所帮助。