php - 使用 Indextank 进行站点搜索

标签 php search indexing web-crawler indextank

我正在寻找易于实现且无广告的免费 G​​oogle CSE 替代品。

我找到了 indextank,它看起来是一种非常简单的内容索引方式,但它不会抓取您的网站。我想我设想能够将它传递给 Google CSE 的 url。

因此,有没有一种简单的方法可以设置 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;
}

最后,您将得到一个包含搜索结果的排序数组。我希望这会有所帮助。

关于php - 使用 Indextank 进行站点搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6146394/

相关文章:

algorithm - 子字符串在字符串中出现的性能

java - 使用 lucene 在 native Android 应用程序中离线索引 json 文档

php - 固定字符串的正则表达式

php - Laravel 代码仅在开发工具打开时才工作

iphone - 如何使用 ARC 知道 Objective C 中的对象是否存活

android - 更改 Searchview 焦点颜色

Mysql 日期字段索引

mysql - 为什么将字段用引号引起来比不用引号花费更长的时间?

javascript - 本地化:Php 和 Javascript

php - 尝试使用Ajax和PHP制作登录表单