搜索引擎的工做流程主要分为三步:从互联网抓取网页→建立抓取网页的索引库→从索引库中进行搜索。html
首 先须要一个能访问网络的爬虫器程序,依据URL之间的关联性自动爬行整个互联网,并对爬行过的网页进行抓取收集。当网页被收集回来后,采用索引分析程序进 行网页信息的分析,依据必定的相关度算法(如超连接算法)进行大量计算,建立倒排序的索引库。索引库建好后用户就能够经过提供的搜索界面提交关键词进行搜 索,依据特定的排序算法返回搜索结果。所以,搜索引擎并非对互联网进行直接搜索,而是对已抓取网页索引库的搜索,这也是能快速返回搜索结果的缘由,索引 在其中扮演了最为重要的角色,索引算法的效率直接影响搜索引擎的效率,是评测搜索引擎是否高效的关键因素。前端
网页爬行器、索引器、查询器共同构成了搜索引擎的重要组成单元,针对特定的语言,如中文、韩文等,还须要分词器进行分词,通常状况下,分词器与索引器一块儿使用建立特定语言的索引库。它们之间的协同关系如图1所示。java
而 开放源代码的搜索引擎为用户提供了极大的透明性,开放的源代码、公开的排序算法、随意的可定制性,相比于商业搜索引擎而言,更为用户所须要。目前,开放源 代码的搜索引擎项目也有一些,主要集在中搜索引擎开发工具包与架构、Web搜索引擎、文件搜索引擎几个方面,本文概要介绍一下当前比较流行且相对比较成熟 的几个搜索引擎项目。mysql
开源搜索引擎工具包web
1.Lucene算法
Lucene 是目前最为流行的开放源代码全文搜索引擎工具包,隶属于Apache基金会,由资深全文索引/检索专家Doug Cutting所发起,并以其妻子的中间名做为项目的名称。Lucene不是一个具备完整特征的搜索应用程序,而是一个专一于文本索引和搜索的工具包,能 够为应用程序添加索引与搜索能力。基于Lucene在索引及搜索方面的优秀表现,虽然由Java编写的Lucene具备天生的跨平台性,但仍被改编为许多 其余语言的版本:Perl、Python、C++、.Net等。sql
同 其余开源项目同样,Lucene具备很是好的架构,可以方便地在其基础上进行研究与开发,添加新功能或者开发新系统。Lucene自己只支持文本文件及少 量语种的索引,而且不具有爬虫功能,而这正是Lucene的魅力所在,经过Lucene提供的丰富接口,咱们能够根据自身的须要在其上添加具体语言的分词 器,针对具体文档的文本解析器等,而这些具体的功能实现均可以借助于一些已有的相关开源软件项目、甚至是商业软件来完成,这也保证了Lucene在索引及 搜索方面的专一性。目前,经过在Lucene的基础上加入爬行器、文本解析器等也造成了一些新的开源项目,如LIUS、Nutch等。而且Lucene的 索引数据结构已经成了一种事实上的标准,为许多搜索引擎所采用。数据库
2.LIUS编程
LIUS 即Lucene Index Update and Search的缩写,它是以Lucene为基础发展起来的一种文本索引框架,和Lucene同样,一样能够看做搜索引擎开发工具包。它在Lucene的基 础上做了一些相应的研究及添加了一些新的功能。LIUS借助于许多开源软件,能够直接对各类不一样格式/类型的文档进行文本解析与索引,这些文档格式包括 MS Word、MS Excel、MS PowerPoing、RTF、PDF、XML、HTML、TXT、Open Office及JavaBeans等,对Java Beans的支持对于进行数据库索引很是有用,在用户进行对象关系映射(如:Hibernate、JDO、TopLink、Torque等)的数据库链接 编程时会变得更加精确。LIUS还在Lucene的基础上增长了索引更新功能,使针对索引的维护功能进一步完善。而且支持混和索引,能够把同一目录下与某 一条件相关的全部内容整合到一块儿,这种功能对于须要对多种不一样格式的文档同时进行索引时很是有用。c#
3.Egothor
Egothor 是一款开源的高性能全文搜索引擎,适用于基于全文搜索功能的搜索应用,它具备与Luccene相似的核心算法,这个项目已经存在了不少年,而且拥有一些积 极的开发人员及用户团体。项目发起者Leo Galambos是捷克布拉格查理大学数学与物理学院的一名高级助理教授,他在博士研究生期间发起了此项目。
更 多的时候,咱们把Egothor看做一个用于全文搜索引擎的Java库,可以为具体的应用程序添加全文搜索功能。它提供了扩展的Boolean模块,使得 它能被做为Boolean模块或者Vector模块使用,而且Egothor具备一些其余搜索引擎所不具备的特有功能:它采用新的动态算法以有效提升索引 更新的速度,而且支持平行的查询方式,可有效提升查询效率。在Egothor的发行版中,加入了爬行器、文本解析器等许多加强易用性的应用程序,融入了 Golomb、Elias-Gamma等多种高效的压缩方法,支持多种经常使用文档格式的文本解析,如HTML、PDF、PS、微软Office文档、XLS 等,提供了GUI的索引界面及基于Applet或者Web的查询方式。另外,Egothor还能被方便地配置成独立的搜索引擎、元数据搜索器、点对点的 HUB等多种且体的应用系统。
4.Xapian
Xapian是基于GPL发布的搜索引擎开发库,它采用C++语言编写,经过其提供绑定程序包可使Perl、Python、PHP、Java、Tck、C#、Ruby等语言方便地使用它。
Xapian 仍是一个具备高适应性的工具集,使开发人员可以方便地为他们的应用程序添加高级索引及搜索功能。它支持信息检索的几率模型及丰富的布尔查询操做。 Xapian的发布包一般由两部分组成:xapian-core及xapian-bindings,前者是核心主程序,后者是与其余语言进行绑定的程序 包。
Xapian 为程序开发者提供了丰富的API及文档进行程序的编制,并且还提供了许多编程实例及一个基于Xapian的应用程序Omega,Omega由索引器及基于 CGI的前端搜索组成,可以为HTML、PHP、PDF、PostScript、OpenOffice/StarOffice、RTF等多种格式的文档编 制索引,经过使用Perl DBI模块甚至能为MySQL、PostgreSQL、SQLite、Sybase、MS SQL、LDAP、ODBC等关系数据库编制索引,并能以CSV或XML格式从前端导出搜索结果,程序开发者能够在此基础上进行扩展。
5.Compass
Compass 是在Lucene上实现的开源搜索引擎架构,相对比于Lucene而言,提供更加简洁的搜索引擎API。增长了索引事务处理的支持,使其可以更方便地与数 据库等事务处理应用进行整合。它更新时无需删除原文档,更加简单更加高效。资源与搜索引擎之间采用映射机制,此种机制使得那些已经使用了Lucene或者 不支持对象及XML的应用程序迁移到Compass上进行开发变得很是容易。
Compass还能与Hibernate、Spring等架构进行集成,所以若是想在Hibernate、Spring项目中加入搜索引擎功能,Compass是个极好的选择。
开源Web搜索引擎系统
1.Nutch
Nutch 是Lucene的做者Doug Cutting发起的另外一个开源项目,它是构建于Lucene基础上的完整的Web搜索引擎系统,虽然诞生时间不长,但却以其优良血统及简洁方便的使用方 式而广收欢迎。咱们可使用Nutch搭建相似Google的完整的搜索引擎系统,进行局域网、互联网的搜索。
2.YaCy
YaCy 是一款基于P2P(peer-to-peer)的分布式开源Web搜索引擎系统,采用Java语言进行编写,其核心是分布在数百台计算机上的被称为 YaCy-peer的计算机程序,基于P2P网络构成了YaCy网络,整个网络是一个分散的架构,在其中全部的YaCy-peers都处于对等的地位,没 有统一的中心服务器,每一个YaCy-peer都能独立的进行互联网的爬行抓取、分析及建立索引库,经过P2P网络与其余YaCy-peers进行共享,并 且每一个YaCy-peer又都是一个独立的代理服务器,可以对本机用户使用过的网页进行索引,而且采起多机制来保护用户的隐私,同时用户也经过本机运行的 Web服务器进行查询及返回查询结果。
YaCy搜索引擎主要包括五个部分,除普通搜索引擎所具备的爬行器、索引器、反排序的索引库外,它还包括了一个很是丰富的搜索与管理界面以及用于数据共享的P2P网络。
开源桌面搜索引擎系统
1.Regain
regain 是一款与Web搜索引擎相似的桌面搜索引擎系统,其不一样之处在于regain不是对Internet内容的搜索,而是针对本身的文档或文件的搜索,使用 regain能够轻松地在几秒内完成大量数据(许多个G)的搜索。Regain采用了Lucene的搜索语法,所以支持多种查询方式,支持多索引的搜索及 基于文件类型的高级搜索,而且能实现URL重写及文件到HTTP的桥接,而且对中文也提供了较好的支持。
Regain提供了两种版本:桌面搜索及服务器搜索。桌面搜索提供了对普通桌面计算机的文档与局域网环境下的网页的快速搜索。服务器版本主要安装在Web服务器上,为网站及局域网环境下的文件服务器进行搜索。
Regain 使用Java编写,所以能够实现跨平台安装,能安装于Windows、Linux、Mac OS及Solaris上。服务器版本须要JSPs环境及标签库(tag library),所以须要安装一个Tomcat容器。而桌面版自带了一个小型的Web服务器,安装很是简单。
2.Zilverline
Zilverline 是一款以Lucene为基础的桌面搜索引擎,采用了Spring框架,它主要用于我的本地磁盘及局域网内容的搜索,支持多种语言,而且具备本身的中文名 字:银钱查打引擎。Zilverline提供了丰富的文档格式的索引支持,如微软Office文档、RTF、Java、CHM等,甚至可以为归档文件编制 索引进行搜索,如zip、rar及其余归档文件,在索引过程当中,Zilverline从zip、rar、chm等归档文件中抽取文件来编制索引。 Zilverline能够支持增量索引的方式,只对新文件编制索引,同时也支持按期自动索引,其索引库能被存放于Zilverline可以访问到的地方, 甚至是DVD中。同时,Zilverline还支持文件路径到URL的映射,这样可使用户远程搜索本地文件。
Zilverline提供了我的及研究、商业应用两种许可方式,其发布形式为一个简单的war包,能够从其官方网站下载(http://www.zilverline.org/)。 Zilverline的运行环境须要Java环境及Servlet容器,通常使用Tomcat便可。在确保正确安装JDK及Tomcat容器后只需将 Zilverline的war包(zilverline-1.5.0.war)拷贝到Tomcat的webapps目录后重启Tomcat容器便可开始使 用Zilverline搜索引擎了。
附:
20款开源搜索引擎介绍
Sphider
Sphider是一个轻量级,采用PHP开发的web spider和搜索引擎,使用mysql来存储数据。能够利用它来为本身的网站添加搜索功能。Sphider很是小,易于安装和修改,已经有数千网站在使用它。
RiSearch PHP
RiSearch PHP是一个高效,功能强大的搜索引擎,特别适用于中小型网站。RiSearch PHP很是快,它可以在不到1秒钟内搜索5000-10000个页面。RiSearch是一个索引搜索引擎,这就意味着它先将你的网站作索引并创建一个数 据库来存储你网站全部页面的关键词以便快速搜索。Risearch是全文搜索引擎脚本,它把全部的关键词都编成一个文档索引除了配置文件里面的定义排除的 关键词。 RiSearch使用经典的反向索引算法(与大型的搜索引擎相同),这就是为何它会比其它搜索引擎快的缘由。
PhpDig
PhpDig是一个采用PHP开发的Web爬虫和搜索引擎。经过对动态和静态页面进行索引创建一个词汇表。当搜索查询时,它将按必定的排序规则显示 包含关键字的搜索结果页面。PhpDig包含一个模板系统并可以索引PDF,Word,Excel,和PowerPoint文档。PHPdig适用于专业 化更强、层次更深的个性化搜索引擎,利用它打造针对某一领域的垂直搜索引擎是最好的选择。
OpenWebSpider
OpenWebSpider是一个开源多线程Web Spider(robot:机器人,crawler:爬虫)和包含许多有趣功能的搜索引擎。
Egothor
Egothor是一个用Java编写的开源而高效的全文本搜索引擎。借助Java的跨平台特性,Egothor能应用于任何环境的应用,既可配置为单独的搜索引擎,又能用于你的应用做为全文检索之用。
Nutch
Nutch 是一个开源Java 实现的搜索引擎。它提供了咱们运行本身的搜索引擎所需的所有工具。包括全文搜索和Web爬虫。
Lucene
Apache Lucene是一个基于Java全文搜索引擎,利用它能够轻易地为Java软件加入全文搜寻功能。Lucene的最主要工做是替文件的每个字做索引,索 引让搜寻的效率比传统的逐字比较大大提升,Lucen提供一组解读,过滤,分析文件,编排和使用索引的API,它的强大之处除了高效和简单外,是最重要的 是使使用者能够随时应自已须要自订其功能。
Oxyus
是一个纯java写的web搜索引擎。
BDDBot
BDDBot是一个简单的易于理解和使用的搜索引擎。它目前在一个文本文件(urls.txt)列出的URL中爬行,将结果保存在一个数据库中。它也支持一个简单的Web服务器,这个服务器接受来自浏览器的查询并返回响应结果。它能够方便地集成到你的Web站点中。
Zilverline
Zilverline是一个搜索引擎,它经过web方式搜索本地硬盘或intranet上的内容。Zilverline能够从PDF, Word, Excel, Powerpoint, RTF, txt, java, CHM,zip, rar等文档中抓取它们的内容来创建摘要和索引。从本地硬盘或intranet中查找到的结果可从新再进行检索。Zilverline支持多种语言其中包 括中文。
XQEngine
XQEngine用于XML文档的全文本搜索引擎。利用XQuery作为它的前端查询语言。它可以让你查询XML文档集合经过使用关键字的逻辑组合。有点相似于Google与其它搜索引擎搜索html文档同样。XQEngine只是一个用Java开发的很紧凑的可嵌入的组件。
MG4J
MG4J可让你为大量的文档集合构建一个被压缩的全文本索引,经过使内插编码(interpolative coding)技术。
JXTA Search
JXTA Search是一个分布式的搜索系统。设计用在点对点的网络与网站上。
YaCy
YaCy基于p2p的分布式Web搜索引擎。同时也是一个Http缓存代理服务器。这个项目是构建基于p2p Web索引网络的一个新方法。它能够搜索你本身的或全局的索引,也能够Crawl本身的网页或启动分布式Crawling等。
Red-Piranha
Red-Piranha是一个开源搜索系统,它可以真正”学习”你所要查找的是什么。Red-Piranha可做为你桌面系统 (Windows,Linux与Mac)的我的搜索引擎,或企业内部网搜索引擎,或为你的网站提供搜索功能,或做为一个P2P搜索引擎,或与wiki结合 做为一个知识/文档管理解决方案,或搜索你要的RSS聚合信息,或搜索你公司的系统(包括SAP,Oracle或其它任何Database/Data source),或用于管理PDF,Word和其它文档,或做为一个提供搜索信息的WebService或为你的应用程序 (Web,Swing,SWT,Flash,Mozilla-XUL,PHP, Perl或c#/.Net)提供搜索后台等等。
LIUS
LIUS是一个基于Jakarta Lucene项目的索引框架。LIUS为Lucene添加了对许多文件格式的进行索引功能如:Ms Word,Ms Excel,Ms PowerPoint,RTF,PDF,XML,HTML,TXT,Open Office序列和JavaBeans.针对JavaBeans的索引特别有用当咱们要对数据库进行索引或恰好用户使用持久层ORM技术 如:Hibernate,JDO,Torque,TopLink进行开发时。
Apache Solr
Solr是一个高性能,采用Java5开发,基于Lucene的全文搜索服务器。文档经过Http利用XML加到一个搜索集合中。查询该集合也是通 过 http收到一个XML/JSON响应来实现。它的主要特性包括:高效、灵活的缓存功能,垂直搜索功能,高亮显示搜索结果,经过索引复制来提升可用性,提 供一套强大Data Schema来定义字段,类型和设置文本分析,提供基于Web的管理界面等。
Paoding
Paoding中文分词是一个使用Java开发的,可结合到Lucene应用中的,为互联网、企业内部网使用的中文搜索引擎分词组件。 Paoding填补了国内中文分词方面开源组件的空白,致力于此并希翼成为互联网网站首选的中文分词开源组件。 Paoding中文分词追求分词的高效率和用户良好体验。
Carrot2
Carrot2是一个开源搜索结果分类引擎。它可以自动把搜索结果组织成一些专题分类。Carrot2提供的一个架构可以从各类搜索引擎 (YahooAPI、GoogleAPI、MSN Search API、eTools Meta Search、Alexa Web Search、PubMed、OpenSearch、Lucene index、SOLR)获取搜索结果。
Regain
regain是一款与Web搜索引擎相似的桌面搜索引擎系统,其不一样之处在于regain不是对Internet内容的搜 索,而是针对本身的文档或文件的搜索,使用regain能够轻松地在几秒内完成大量数据(许多个G)的搜索。Regain采用了Lucene的搜索语法, 所以支持多种查询方式,支持多索引的搜索及基于文件类型的高级搜索,而且能实现URL重写及文件到HTTP的桥接,而且对中文也提供了较好的支持。
Regain提供了两种版本:桌面搜索及服务器搜索。桌面搜索提供了对普通桌面计算机的文档与局域网环境下的网页的快速搜索。服务器版本主要安装在Web服务器上,为网站及局域网环境下的文件服务器进行搜索。