Linux 版 (精华区)

发信人: netiscpu (说不如做), 信区: Linux
标  题: 利用LINUX搜寻网站
发信站: 哈工大紫丁香 (Mon May 17 13:27:57 1999), 转信

"Linux公报...让Linux更富魅力!" 

---------------------------------------------------------------------------

-----

利用LINUX搜寻网站 

作者:Branden Williams 译者: 咸鱼 

---------------------------------------------------------------------------

-----

随着您的网站不断完善,访问您站点的人也会越来越多,大多数人就象你和我一样,希

望进入您的站点,按一个按纽,得到需要的信息。为更好地服务于这些用户,Interne

t相应设置了"站点搜索",这是一种搜寻单个站点从而获得所需信息的方法。作为一个

系统管理员,人们曾要求我提供应用在他们的站点上的搜索引擎,这样他们的用户就能

尽快地得到他们所寻的信息。

然而麻烦的是大多数搜索引擎(Internet也不例外)索引所有的站点并进行搜索。例如

,您正在寻找二手车,并且您决定找一种90年代早期的Nissan车。于是您上了网,进入

Altavista。如果您搜索"used Nissan truck",您很可能会得到好几页的信息,上面列

满了各种汽车,当您链接上以后看到列满二手车的长达400K的HTML文件时,麻烦随之而

来。您要么逐行寻找直到找到为止,要么就象大多数人一样利用浏览器的查找命令。

那么如果您能够一次性搜寻到您要的二手车并得到满意结果不是更好了吗?

最近我为一家公司设计了名为Resource Spectrum(http://www,soectrymm.com/)的

CGI搜索程序,它是一种快速的文件搜索。Resource Spectrum 是一种类似于我的汽车

比喻的解决方法。例如,一家公司是高技术工种的职介机构,需要另一种方法发布他们

的职介编目。这里将介绍的是在他们的新网址上建立可搜寻的职介编目。

当我们看到的这个职介编目时,它是一个Word文本并已转化成HTML。 我费了很长时间

艰难地寻找我所能用的东西,但没找到任何东西。我发现所有搜索引擎都只能搜索站点

而不是单个文件。

这就是DocSearch这个想法的由来。

我所需的是一种简单清晰的途径来检索单一HTML文件,这样用户就可以简单、快捷地得

到他们所需的信息。我找出了PERL参考资料,并花了几个下午解决了这个问题 。作了

一些修改以后,就是您所看到的DocSearch 1.0.4。您可以在ftp://ftp.inetinc.net/

pub/docsearch/docsearch.tar.gz找到最新版本。

让我们浏览一下代码看看它是如何运作的。首先,在我们进行之前,您必须确信已安装

了CGI 库(cgi-lib.pl)。如果您还未安装,您可以从http://www.bio.cam.ac.uk/cgi-

lib/中下载它。这只是一个包含了CGIs许多项有用功能的Perl程序库。 将它安装在您

的cgi-bin目录里,使它对所有人都可读并可执行。(chmod a+rx cgi-lib.pl)

这样您就可以配置DocSearch了。一开始必须设置一些常量。它们与您正在搜索的文件

有关。例如:

# The Document you want to search.

$doc = "/path/to/my/list.html";

写入待检索文件的绝对路径。

# Document Title. The text to go inside the

# <title><title>HTML. Tags.

$htmltitle = "Nifty search Results"

把这个设置成您想要生成的结果页面名。

# Optional Back Link. If you don't want one, make the string null.

# i.e. $backlink = "";

$backlink = "http://www.inetinc.net/some.html";

如果您要提供一个"Go Back"链接,写入$backlink该页的URL。 

# Record delimiter. The text which separates the records.

$recdelim = " ";

这部分是搜索的一个重要方面。您所搜索的html文件必须用特定的字符串来分隔各个"

records"。用英语来讲,您需要放置一些HTML标记或其它东西把可能的搜索结果标记出

来。在我的例子里,MS Word缺省将$nbsp作标识符来分隔所有的记录,因此我只是用它

作为分隔定界符。

然后从HTML格式中ReadParse()我们的信息。HTML格式用来作为CGI的前端。为简化以后

的工作,我们继续将变量$query设定成搜索对象。

$query = $input{'term'};

为了缩小搜索范围,每次使用查询项,这个步骤可以重复。如果您想使这些查询项成为

可选项,只要在您的代码中加入这一行:

if ($query eq "") {

$query = " ";

}

这将匹配您搜索的任何记录。

现在产生了一个重要的步骤。我们必须确信任何元字符都被换码。PERL的匹配运算符利

用元字符来改变搜索输出。我们要确信输入格式的任何字符在任何情况下都不会改变搜

索输出。

$query =` s/([-+i.<>&|`%=])/\\\1/g;

# Boy does that look messy!

基本上这是一个正则表达法来更换所有这些元字符。这将把 +改为 \+。

现在我们要打开目标文件。我们得把整个文件读成一个变量。 我们的工作从这里真正

的开始了。

open (SEARCH, "$doc")

undef $/:

$text = <SEARCH>;

close (SEARCH);

您唯一不熟悉的东西是您看到的undef $/;为使我们的搜索准确运作,我们必须改变这

个Perl变量的定义,因为这个变量会将输入文件按行分开。这样做非常必要,我们要将

整个文件读成单个变量,如果不改变这个Perl变量的定义,将只会有一行被读出。

现在我们开始输出结果页面。如果能够将其做的对用户具吸引力就太好了。这是自由格

式的HTML,所有的HTML迷们,轮到你们了。

现在我们要真正开始搜索了。这是我们搜索的乐趣所在。您会注意到在搜索中有两个经

注释的正则表达式。如果您不想显示任何图象或链接,您必须对那些行列不加注释。

@records = split(/$recdelim/,$text);

我们想将文件分为数组的记录。每个记录是一个有效的搜索结果,但又与其它记录分开

。以下就显示了记录定界符的用处。

Foreach $record(@records)

{

#$record =` s/<a.*<\/a>//ig;

# Do not print links inside this doc.

#$record =` s/<img.*>//ig;

# Do not display images inside this doc. 

if ( $record =` /$query/I ) {

print $record;

$matches++;

}

}

这个基本上显示了与我们的搜索规则相匹配的每个$record。如果有类似的表述,您可

加以改变搜索规则从而改变搜索结果。

If ( ($record =` /$query/I) && ($record =` /$anotheritem/) ) {

这将尽力匹配查询$record, 经过成功的匹配后,$record将会被转贮到结果页面。每次

匹配的时候,注意我们是如何同时为称为$matches的变量增量的。这主要到不是为了告

诉用户已经发现了多少不同的记录,更重要的是如果没有找到匹配,我们可以被告知,

这样我们可以告诉用户没有找到要的东西,系统并没有当掉,但是事实是在查询基础上

我们没有找到任何匹配的记录。

既然我们做了搜索并显示了搜索结果,我们需要做一些管理工作从而确信我们已经完成

了我们的工作。 正如我以前所提到的,我们需要在搜索中检查zero matches (0 匹配

) 并且让用户知道我们找不到任何与查询匹配的东西。

If ($matches eq "0") {

$query =` s/\\//g;

print << "End_Again";

<center>

<h2>Sorry! "$query" was not found!</h2><p>

</center>

End_again

}

请注意正则表示法。这里我们必须要很麻烦地更换那些meta字符,我们必须去掉那些换

码字符。当他们发现他们的$query没有找到,他们就不会看一眼,并且会说,"那不是

我刚才输入的要查询的东西",接下来我们就要输出使用户失望的HTML了。

剩下的两件事就是清晰地结束HTML文件,并且允许后退连接。

if ( $backlink ne " " ) {

print "<center>";

print "<h3><a href=\"$backlink\">Go

back</a></h3>";

print "</center>";

}

print << "End_of_Footer";

</body>

</html>

End_of_footer

所有工作都完成了。现在您感到非常高兴因为用户高兴了。您不仅理顺了您的网站,可

以搜索单个文件,并且加强了用户的实用性,给他们想要的结果。这唯一的结果是更高

的命中率。通过帮助您的用户获得他们想要的信息,他会告诉他的朋友们您的站点,然

后他的朋友们会告诉他们的朋友们,越来越多的人会知道。用户第一有时确实有效。 

---------------------------------------------------------------------------

-----

Copyright ? 1998, Branden Williams 

Published in Issue 32 of Linux Gazette, September 1998

---------------------------------------------------------------------------

-----

--
☆ 来源:.哈工大紫丁香 bbs.hit.edu.cn.[FROM: bin@mtlab.hit.edu.cn]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.375毫秒