PHP中基于Linux的搜索引擎实现

搜索引擎

  搜索引擎是为用户提供快速获取网页信息的工具,其主要的功能是系统通过用户输入关键字,检索后端网页数据库,将相关网页的链接和摘要信息反馈给用户。从搜索的范围上一般分为站内网页搜索和全局网页搜索。随着网页数量的急剧增加,搜索引擎已经成为上网查询信息的必须手段,各个大型网站均已经提供网页数据搜索服务,并且出现了许多为大型网站提供专业搜索引擎服务的公司,如为Yahoo提供搜索服务的Google,为新浪网和263等国内网站提供服务的百度公司等。专业的搜索服务费用高而免费的搜索引擎软件基本都是基于英文的检索,所以都不太适合Intranet环境(如校园网等)的需要。

  搜索引擎的基本组成一般分为网页收集程序、网页后端数据组织存储、网页数据检索三部分。决定搜索引擎好坏的关键因素是数据查询的响应时间,即如何组织好满足全文检索需要的大量网页数据。

  GNU/Linux作为一个优秀的网络操作系统,其发行版本中集成了大量的网络应用软件,如 Web服务器(Apache + PHP)、目录服务器(OpenLDAP)、脚本语言(Perl)、网页收集程序(Wget)等。所以,通过将它们集中进行应用,便可以实现一个简单、高效的搜索引擎服务器。

  一、基本组成和使用方法

  1、网页数据收集

  Wget程序是一个优秀的网页收集程序,它采用多线程设计能够方便地将网站内容镜像到本地目录中,并且能够灵活定制收集网页的类型、递归收集层次、目录限额、收集时间等。通过专用的收集程序完成网页的收集工作,既降低了设计的难度又提高了系统的性能。为了减小本地数据的规模,可只收集能够查询的html文件、txt文件、脚本程序asp和php只使用缺省的结果,而不收集如图形文件或是其他的数据文件。

  2、网页数据过滤

  由于html文件中存在大量的标记,如<body><table>等,这些标记数据没有实际的搜索价值,所以加入数据库前必须对收集的数据进行过滤。Perl作为广泛使用的脚本语言,拥有非常强大而丰富的程序库,可以方便地完成网页的过滤。通过使用HTML-Parser库可以方便地提取出网页中包含的文字数据、标题数据、链接数据等。该程序库可以在www.cpan.net中下载,并且该网站收集的Perl程序涉及范围之广,远远超出我们的现象。

  3、目录服务

  目录服务是针对大量数据检索需要开发的服务,最早出现在X.500协议集中,后来扩展到TCP/IP中发展成为LDAP(Lightweight Directory Acess Protocol)协议,其相关的标准为1995年制定的RFC1777和1997年制定的RFC2251等。LDAP协议已经作为工业标准被Sun、Lotus、微软等公司广泛应用到其相关产品中,但是专用的基于Windows平台的目录服务器却较少见,OpenLDAP是免费的运行于Unix系统的目录服务器,其产品的性能优秀,已经被许多的Linux发行版本收集(Redhat、Mandrake等),并且提供了包括C、Perl、PHP等的开发接口。

  使用目录服务技术代替普通的关系数据库作为网页数据的后端存取平台主要基于目录服务的技术优势。目录服务简化了数据处理类型,去掉了通用关系数据库的费时的事务机制,而是采用全局替换的策略对数据进行更新,其应用的重点是大量数据的检索服务(一般数据更新和检索的频率比例要求在1:10以上),强调检索速度和全文查询,提供完整的数据备份,非常适合搜索引擎之类服务的需要。从目录服务技术解决问题的重点不难看出其在数据检索上的优势,它的提出时间远远落后于关系数据库的提出时间,实际上反映了根据具体问题优化数据解决方案的原则。这与目前广泛存在的凡是涉及大量数据处理必选SQL Server的处理方法形成鲜明对比。

  通过选用成熟的目录服务技术提高网页查询的效率,能够简洁有效地提高数据处理能力。这也充分显示了GNU/Linux系统运行开放软件的优势,毕竟不能方便地获得运行于其他平台的目录服务器。

  4、查询程序设计

  搜索引擎的前端界面是网页,用户通过在特定的网页中输入关键字提交给Web服务器进行处理。运行在Apache Web服务器上的PHP脚本通过运行其相关ldap函数便可以执行关键字的查询工作。主要进行的工作是根据关键字构造查询、向目录服务器提交查询、显示查询结果等。Linux + Apache + PHP作为广泛使用Web服务器,与WinNT + IIS + ASP相比其性能毫不逊色,在目前的Linux发行版本中都集成了Apache + PHP 以及缺省的ldap、pgsql、imap等模块。

  5、计划任务

  搜索引擎的网页数据收集、数据过滤、加入目录数据库等工作都应该是自动完成的,在UNIX系统中有cron进程来专门完成按照特定时间调度任务,为了不影响系统的运行,一般可以把这些工作安排到深夜进行。

  二、具体步骤和注意事项

  1、配置Wget软件

  在RedHat 6.2发行版中已经集成了该软件包,可以直接进行安装。将需要镜像的站点地址编辑为一个文件中,通过 -I 参数读入该文件;为镜像的站点指定一个本地下载目录;为了避免内部网中链接的重复引用,一般只镜像该站点内的数据;还可以根据网站的具体情况,指定其镜像的深度。

  2、配置Openldap服务

  在RedHat 6.2发行版中已经集成了Openldap-1.2.9,其配置文件存放在/etc/openldap的目录中。主要的配置文件是slapd.conf,关键要打开对检索速度至关重要的index选项,可以使用setup工具,将ldap在系统引导后作为缺省服务启动。

  Ldap服务可以通过文本文件方式存放数据,即LDIF文件格式。使用此方式可以高效地更新目录服务数据,需要注意LDIF格式是通过空行对数据进行分隔的,并且通过运行ldif2lbm将LDIF格式数据导入目录数据库中时需要暂停目录服务。

  3、编制数据过滤和LDIF文件生成脚本

  为了方便地过滤网页数据,可以调用Perl的HTML-Parser库函数,该程序包下载后需要进行编译,在eg目录下生成了相关的htext,htitle程序,在Perl中可以通过调用外部程序的方式运行该程序,并对其过滤结果通过重定向的方法生成临时文件。本搜索引擎设计的目录数据属性有dn 、link、title、modifydate、contents,其中的dn通过Link进行唯一性标识,将过滤后的网页文本内容通过/usr/sbin/ldif程序进行自动编码后放入LDIF文件中。

  基本的LDIF文件格式如下:

dn: dc=27jd,dc=zzb
objectclass: top
objectclass: organization

dn: link= http://freemail.27jd.zzh/index.html, dc=27jd ,dc=zzb
link: http://freemail.27jd.zzh/index.html
title: Webmail主页
modifydate: 2001年2月8日
contents::
CgpXZWJtYWls1vfSswoKCgoKIKHvoaG7ttOtyrnTw1dlYm1haWzPtc2zoaGh7yDO0t
KqyerH69PKz+QhISFPdXRsb29rxeTWw6O6U01UUDogZnJlZW1haWwuMjdqZC56emJQ
T1AzOiBmcm
VlbWFpbC4yN2pkLnp6YkROUyA6IDExLjk5LjY0Ljiy4srU08O7p6O6bWFpbGd1ZXN00
8O7p7/awe
6jum1haWxndWVzdNLR16Ky4dPDu6cg08O7p8P7OkAgZnJlZW1haWwuMjdqZC56emK/
2sHuOqChoa
AgIKHyzOG5qbf+zvEgofKzo7z7zsrM4iCh8s2o0bbCvKHyICCh8sq1z9bUrcDtIKHywfTR1
LK+of
IgofK8vMr1sr/W99Kzsb7Ptc2z08nK1NHpvLzK9bK/zfjC59bQ0MS9qMGius3OrLukCgoK
CqAKCg
o=
objectclass:webpage

基本的slapd.conf文件如下:
defaultaccess read
include /etc/openldap/slapd.at.conf
#include /etc/openldap/slapd.oc.conf
schemacheck off
sizelimit 20000
pidfile /var/run/slapd.pid
argsfile /var/run/slapd.args
#######################################################################
# ldbm database definitions
#######################################################################
database ldbm
dbcachesize 1000000
index contents,title
suffix "dc=27jd, dc=zzb"
directory /usr/tmp
rootdn "cn=root,dc=27jd, dc=zzb"
rootpw secret

  通过对一个4万个网页(约300M左右)的本地html文件目录进行过滤后生成的LDIF文件约180M左右,如果只取文字数据的前400个字符作为网页内容,则生成文件约35M左右。

  4、配置PHP+LDAP服务

  在Redhat6.2中已经集成了PHP3和php-ldap模块,选择完全安装时便已经安装到/usr/lib/apache目录中,注意检查/etc/httpd/php3.ini中的动态扩展(Dynamic Extensions)中的extension=ldap.so是否被选择。PHP3中提供了丰富的LDAP存取函数,能够方便完成对目录数据的搜索功能。有关Apach + PHP编程方面的资料较多,在此不在赘述。注意在PHP3中的LDAP搜索函数ldap_search不能处理其返回结果超过目录服务设定的最大检索数据,所以可以根据具体情况,在slapd的配置文件中设定较大的检索数据限制(sizelimit),此问题在PHP4中已经解决。

  5、任务调度

  在Redhat6.2中已经集成了crond并且缺省安装后便已经启动。其相关配置文件有/etc/crontab、/etc/cron.daily、/etc/cron.hourly、/etc/weekly、/etc/monthly,你只需要根据数据的更新频度,将网页收集、网页过滤、生成LDIF文件、停止目录服务、更新目录数据、重新启动目录服务,作为一个简单的Shell程序放入到相应的目录中即可。

  三、效果与思考

  以上简单的介绍了我们的搜索引擎的实现方法和注意事项,这仅仅是我们在对GNU/Linux了解得非常肤浅的情况下设计的以目录服务为核心的满足内部网需要的搜索引擎系统,并不能代表GNU/Linux和它集成的大量软件的真正实力。

 通过在一台安装RedHat Linux 6.2 的Sparc Ultra 250上实际测试,对拥有4万个网页的目录数据进行搜索时,基于上述方法设计的搜索引擎响应速度一般在3秒左右,目录数据完全更新大约需要4小时左右,能够满足内部网的需要。实际上,限制搜索响应速度的关键是PHP3的ldap_search函数没有提供数据限制的功能,导致在查询结果集过大时系统响应速度变慢,因为每次用户能够浏览的查询结果实际是非常少的,而服务器端每次的查询总是返回全部结果,在PHP4中的ldap_search通过指定sizelimit参数,能够有效解决该问题。

  目录服务的应用范围非常广泛,实际上作为大型的信息站点为了提高客户访问效率,都或多或少采用了目录服务的技术。目录服务根据具体的应用需求的优化设计方法,对我们决定应用系统的开发无疑是一个启发,应该说在基于索引信息的领域LDAP服务远远优于传统的关系数据库系统。

  基于GNU/Linux进行网络服务器程序设计,能够充分体会到开放源代码的魅力和实力,它既能够简化系统的设计,又大大地提高了工作效率,同时也有效降低了系统的成本。程序设计由一切从零开始的复杂繁琐的重复劳动,简化为问题抽象、功能分解、查找资源、组合系统四个部分,更加强调对系统的认识、开阔的视野和学习的能力,同时开放源代码也为系统进一步优化提供了坚实的基础

时间: 2024-10-29 09:32:10

PHP中基于Linux的搜索引擎实现的相关文章

嵌入式Linux中基于framebuffer设备的jpeg格式在本地LCD屏显示

在基于Linux的视频监控采集系统中,摄像头采集到的一帧视频图像数据一般都是经过硬件自动压缩成jpeg格式的,然后再保存到摄像头设备的缓冲区.如果要把采集到的jpeg格式显示在本地LCD屏上,由于我们的Linux系统没有移植任何GUI系统,就要考虑以下方面: 1. 将jpeg格式解压缩为位图格式,也就是jpeg解码. 2. 将解码出来的位图格式输出到本地的LCD屏上. 在Linux系统下是通过写入帧缓冲(framebuffer)来实现的. 3. framebuffer相当于为LCD设备提供一个统

搭建基于LINUX平台的Informix开发环境

Informix关系数据库管理系统是一个跨平台.全功能的RDBMS,后改造为ORDBMS,它具有各种特性,并且能够十分方便地与各种GUI前端工具相连接.目前Informix数据库产品在我国的金融和保险行业有着广泛的应用.Linux是当今非常流行的一种操作系统,功能强大,源码公开,可以方便地构建自己个性化的网络服务器.Informix企业级数据库管理系统Informix On-Line Dynamic Server.中小型数据库管理系统Informix SE.面向C语言的开发工具ESQL/C.快速

基于Linux集群技术的校园网络中心方案

随着网络技术的发展和网络应用的进一步深入,校园网络承担了越来越多的来自教学.科研及管理方面的应用.校园网络中心作为校内局域网络的数据存储发布.流量的管理控制.用户的管理以及内外网络转接控制中心,必须解决因流量增加所带来的一系列问题.传统的网络中心方案中,当流量增加后,一般是升级单一的服务器系统,这往往会造成过高的投入和维护成本,极大地降低了性能价格比.运用基于Linux集群技术设计的校园网络中心方案可以有效地解决这一问题. 校园网络中心体系结构 基于Linux集群技术的校园网络中心的体系结构是以

基于Linux下 Oracle 备份策略(RMAN)

基于Linux下 Oracle 备份策略(RMAN) --********************************** -- 基于Linux下 Oracle 备份策略(RMAN) --**********************************       对于 Oracle 数据库的备份与恢复,尽管存在热备,冷备以及逻辑备份之外,使用最多的莫过于使用RMAN进行备份与恢复.而制定RMAN备份策略则是基于数据库丢失的容忍程度,即恢复策略来制定.在下面的备份策略中,给出的是一个通用

使用 Linux 瘦客户机实现云计算--基于 Linux 的云计算系统有益于用户和环境

从 Linux® 的角度探讨云计算,并发现一些最新颖.最流行的基于 Linux 的解决方案 -- 特别关注一些可以带来环境效益的选择. 我们已经在大量场合中从不同的角度讨论了云计算.对于嵌入式 Linux 工程师和爱好者,云计算的一个令人兴奋的方面就是它在瘦客户机上的应用. 云计算的一个基本概念就是利用通过 Internet 得到的资源.通过综合功能有限的客户机,云计算在很大程度上类似于借助 LAN 的客户机-服务器计算,使用了哑(dumb)终端或曾经十分流行的瘦客户机.("瘦" 的含

基于Linux进行移动开发的5个基本技能

随着越来越多的人依靠手机进行各种业务,移动应用开发的重要性也在不断增加.虽然他们与桌面应用程序有很多相似之处,但移动应用程序本身也具有一系列挑战和特殊性.因此,希望在当前市场找到有利就业的程序员将需要利用和发展当前需求的技能.当涉及到在Linux平台上的移动应用开发时,以下5个基本开发技能必不可少. 1.Java Java主要用于构建本机Android程序.有许多不同的框架,但是学习如何使用它们一定得从对Java的理解开始.Java以其稳定性和安全性而着称,它的两个特性使其成为对企业特别具有吸引

暗渡陈仓:用低消耗设备进行破解和渗透测试3.1.2 基于Linux方案的选择

3.1.2 基于Linux方案的选择 毫不奇怪,作为最受欢迎的开源操作系统,Linux中的一些版本可用于Beagle系列的开放硬件.Linux被认为是一个由程序员为程序员设计的操作系统.Linux以充分发挥硬件性能而闻名,尤其是对于比较低端或者比较老旧的计算机硬件.当然,这并不是说Linux在高端硬件上运行得不够好.Windows用户不久前才脱离32位兼容模式运行应用程序的禁锢,而Linux系统的用户早在2001年就已经可以使用64位操作系统了.事实上,64位的Linux内核在AMD首款AMD6

基于Linux的物联网操作系统知多少

说到物联网应用的操作系统,就不能不提Linux,因为Linux系统是目前物联网设备中应用最广泛的操作系统,之前我有讲过关于Windows物联网操作系统,那么本文就来详细介绍一下基于Linux的物联网操作系统. 传统的Linux在内核的基础上,经过缩减可以移植到嵌入式操作系统上面,后来很多商业公司和开源组织对Linux系统进行了一番改造,使其更加适用于嵌入式系统和物联网应用的需求,就是修改为实时操作系统.现在我将基于Linux进行修改的实时操作系统与物联网应用系统一一介绍一番. RTLinux R

卡巴斯基发布操作系统Kaspersky OS:完全自主非基于Linux

为人熟知的网络安全和杀毒软件公司卡巴斯基推出了新的安全操作系统:Kaspersky OS.卡巴斯基CEO Eugene Kaspersky在博客文章开头就展示了一个黑盒子--一款三层交换机,这台设备就是采用了卡巴斯基的操作系统,其上赫然写着:Powered by KasperskyOS卡巴斯基操作系统."这款系统是为那些对数据安全有特别需求的网络准备的." 卡巴斯基发布操作系统Kaspersky OS:完全自主非基于Linux 据说Kaspersky OS的开发历经了14年之久,卡巴斯