您正在查看 "搜索引擎" 分类下的文章 2008年04月02日 星期三 15:47 接触搜索引擎已过一年,春风倦人,日闲无事,遂将心中所思备录之。非敢指教旁人,只供大家解解寂寥。
初涉搜索引擎,无非熟析其基本原理,诸如倒排索引,中文分词等,做到知其所以然,加之编程经验,便能写出一个有模有样的搜索引擎来。
日转星移,对搜索引擎之理解亦愈真切。搜索引擎含数据结构之广度,算法之复杂度,我未曾见之。 便终日研讨算法,每领悟一处,皆兴奋不已。积沙成塔,立于塔顶,俯首回望,行行足迹间,分明写着“数学”二字。才知“数学”之博大精深, 悲喜万分!
意欲将所学算法应用于实际,却发现并非容易。搜索引擎速度力求迅雷,如若算法应用不当,则结果让人喜而速度让人忧;如果只顾速度不思算法,则速度让人允而结果让人惑。
细想,世间万物皆追求平衡,搜索引擎亦如此,取舍于准确与速度之间,若能兼顾二者,便能接近完美。完美源于不完美之物的组合。
|
2008年03月27日 星期四 14:17 2008年03月25日 星期二 14:07 2008年03月12日 星期三 14:23 2008年03月11日 星期二 9:27 我在google上搜索“没谱是什么意思",结果搜索出来的全是"MP3是什么意思"。
难道google认为"没谱"和"Mp3"是同义词?
google有点笨!
|
2008年02月21日 星期四 13:34 2007年10月26日 星期五 9:49 假设有以下3篇文章:
[1]看雪软件安全论坛汇聚了许多技术人才,一篇篇有技术含量的精华文章不光对他人有帮助,同时也是自己才华的展示。正是看到这种技术气氛,不少公司都很关注论坛技术人才。
[2]天空软件站:提供国内外最新免费软件、共享软件下载!
[3]pchome下载中心是拥有数以万计的软件工具、多彩娱乐搞笑游戏、绚丽皮肤素材和精彩视频片断等丰富内容的互联网资源下载宝藏.
现在的需求:
(1)要求检索出包含"软件"的文章有哪些?
(2)要求检索出包含"下载"的文章有哪些?
我们最先想到的方法是用字符串匹配的方式在每篇文章中搜索"软件", 如果存在这个词, 则将这篇文章添加的结果中.
一般的数据库软件的全文检索, 如:
select id from topic where content like '%软件%';
这样的语句也是用这种方法实现的:
虽然这种方法能计算出结果, 但是如果对大数据量(如1千万)的文档进行统计, 可想而知速度是很慢的.
于是我们引入了倒排文件, 首先看我们的倒排文件创建后是什么样子:
[关键词] [文章编号][文章编号]...
......
......
[软件] [1][2][3]
......
......
[下载] [2][3]
......
......
有了这个倒排文件, 完成问题(1)(2)那就很简单了, 直接返回相应的关键字后面的文章编号序列就可以了.
那么这个倒排文件如何创建呢?
我们需要一个分词器, 分词器的功能是将一篇文章切成词, 例如文章[2]将有可能切成:
天空/软件站/提供/国内外/最新/免费软件/共享/软件/下载/
于是倒排文件中的[软件]后的文章编号便添加了文章编号[2], [下载]后的文章编号也添加了文章编号[2]
搜索引擎就是靠这样的倒排索引文件实现最基本的高速检索的. |
2007年10月17日 星期三 22:37 最近在实现搜索引擎的动态摘要功能, 将想到的方法总结如下:
方法一. 只记录关键字在一篇文档中第一次出现的位置
产生动态摘要时, 根据关键字第一次出现的位置p向前后扩展, 扩展至完整的句子, 扩展到需要的摘要的长度为止. 如果同时检索多个关键字, 那么各句动态摘要合并起来, 可能中间需要用省略号连接.
这种方法产生动态摘要的速度最快, 存储位置占用的空间最小; 但是可能产生的动态摘要不是最好的.
方法二. 记录关键字在一篇文档中所有出现的位置
记录所有的位置可以计算出文档的哪一部分与查询最相关, 尤其进行多关键字查询时, 将每个关键字出现的所有位置进行统计, 计算出文档的哪一部分同时出现了这几个关键字, 从而产生动态摘要. 这样产生的动态摘要比较准确, 但是存储位置占用的空间比较大.
方法三. 对文档事先进行断句(分块)处理, 记录关键字出现的所有句子编号.
生成动态摘要时, 对包含查询关键字的句子进行打分, 将得分最高的句子做为摘要.
这样产生的动态摘要也比较准确, 但是这种方法需要对文档事先进行断句(或是分块)的预处理.
目前我采用第一种方法. 以后可能会采用第三种方法. 下面是我采用第一种方法产生的效果:
|
2007年09月29日 星期六 9:40 好久没有用过天网搜索引擎了.
今天怀旧一下, 在地址栏敲入http://www.tianwang.com/. 呵呵, 想试一下, 天网有没有改进, 结果让我失望:
搜索引擎领域科研研究院所落后于商业公司.
|
2007年08月27日 星期一 16:15 2007年08月21日 星期二 15:00 一, 开源项目
(1)Lucene
地址: http://lucene.apache.org/
Lucene是apache软件基金会jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。
Lucene的原作者是Doug Cutting,他是一位资深全文索引/检索专家,曾经是V-Twin搜索引擎的主要开发者,后在Excite担任高级系统架构设计师,目前从事于一些Internet底层架构的研究。早先发布在作者自己的http://www.lucene.com/,后来发布在SourceForge,2001年年底成为apache软件基金会jakarta的一个子项目:http://jakarta.apache.org/lucene/。
(2)ASPseek
地址: http://www.aspseek.org/
ASPseek是一个由SWsoft公司开发, 基于GNU GPL发布, 使用C++和STL实现的web搜索引擎。它主要包括三部分:索引机器人,搜索器, CGI搜索前端。ASPseek可以索引几百万个URL并且可能用给定的词或短语来检索, 能使用通配符, 进行布尔搜索。搜索结果可以限定在给定的时间和站点空间内,并能按相关性(页面权重)或者时间进行排序。
ASPseek支持多种语言编码, 它的程序是基于多站点进行优化的, 例如多线程检索,同步DNS查找,结果分组, Web空间等, 同时它对单个站点的搜索也支持得很好。ASPseek还包括其他一些特性, 如支持停用词(stopwords)和拼写检查(ispell), 字符集和语言的预测, 搜索结果的HTML模板,查询词高亮度显示等.
(3)DataparkSearch
地址: http://www.dataparksearch.org/
DataparkSearch是一个基于GPL发布的搜索引擎, 可以用来创建中小型的个人或企业搜索引擎. 它的优点在于支持中文, 包括支持Unicdoe/GB/Big5码, 以及具有简单的切词功能.
除了搜索网页并建立索引, DataparkSearch还能够直接从MySQL等资料库收集内容, 能够把动态网页的资料直接由资料库中建立索引.
(4)Swish-e
地址: http://swish-e.org/
Swish-e是一个快速,灵活,开源的网页和文件索引系统.Swish-e适合百万以内的文档量, 它借助GNOME libxml2解析器和收集过滤器, 可以将文本,电子邮件,PDF,HTML,XML以及微软的Word/PowerPoint/Excel等所有可以转化为XML或HTML的任何文件进行索引. Swish-e也常常被当作数据库(例如MySQL数据库管理系)快速全文检索的补充.
(5)ht://Dig
网址: http://www.htdig.org/
ht:/Dig系统是一个完整的适用于局域的Web索引和检索系统.这个系统的目的并不是去代替像Lycos,Infoseek,Google和AltaVista等这些高效的因特网搜索引擎.它的目的是满足一个公司, 学校, 或网站的搜索功能需要.
(6)Indri
网址: http://www.lemurproject.org/indri/
Indri是一个完整的开源搜索引擎,由卡耐基-梅隆大学Lemur项目组维护并持续开发。
二,组件和开发包
三,搜索引擎官方blog和网站
一些搜索引擎有官方的blog, 常常会发布一些最新的产品动态和搜索引擎技术的文章. 值得一看.
(1)google黑板报
网址: http://googlechinablog.com/
著名的数学之美系列文章就出自google黑板报.
(2)搜狗实验室
网址: http://www.sogou.com/labs/
搜狗实验室公布的资源很多, 例如网络流行词库等等.
(待续) |
2007年07月13日 星期五 23:34 如果有时间, 我会写一个这方面的开源项目.
这里是我画的框架图:
|
2007年06月15日 星期五 17:20 我们将其命名为"瑞星病毒资料与资讯搜索", 这样感觉更合适, 因为它不仅能搜索病毒资料, 也能搜索瑞星网站的资讯.
我们将virusinfo.rising.com.cn这个域名更名为:
so.rising.com.cn
同时,为了更人性化, 我们添加了几个等效的域名:
sou.rising.com.cn
soo.rising.com.cn
search.rising.com.cn |
2007年06月04日 星期一 22:42 1. 基于字词结合的信息处理方式。巧妙解决了中文信息的理解问题,极大地提高了搜索的准确性和查全率。
2. 支持主流的中文编码标准。包括GBK(汉字内码扩展规范)、GB2312(简体)、BIG5(繁体),并且能够在不同的编码之间转换。
3. 智能相关度算法。采用了基于内容和基于超链分析相结合的方法进行相关度评价,能够客观分析网页所包含的信息,从而最大限度保证了检索结果相关性。
4. 检索结果能标示丰富的网页属性(如标题、网址、时间、大小、编码、摘要等),并突出用户的查询串,便于用户判断是否阅读原文。
5. 百度搜索支持二次检索(又称渐进检索或逼进检索)。可在上次检索结果中继续检索,逐步缩小查找范围,直至达到最小、最准确的结果集。利于用户更加方便地在海量信息中找到自己真正感兴趣的内容。
6. 相关检索词智能推荐技术。在用户第一次检索后,会提示相关的检索词,帮助用户查找更相关的结果,统计表明可以促进检索量提升10-20%。
7. 运用多线程技术、高效的搜索算法、稳定的UNIX平台、和本地化的服务器,保证了最快的响应速度。百度搜索引擎在中国境内提供搜索服务,可大大缩短检索的响应时间(一个检索的平均响应时间小于0.5秒)
8. 可以提供一周、二周、四周等多种服务方式。可以在7天之内完成网页的更新,是目前更新时间最快、数据量最大的中文搜索引擎。
9. 检索结果输出支持内容类聚、网站类聚、内容类聚+网站类聚等多种方式。支持用户选择时间范围,提高用户检索效率。
10. 智能性、可扩展的搜索技术保证最快最多的收集互联网信息。拥有目前世界上最大的中文信息库,为用户提供最准确、最广泛、最具时效性的信息提供了坚实基础。
11. 分布式结构、精心设计的优化算法、容错设计保证系统在大访问量下的高可用性、高扩展性、高性能和高稳定性。每个部分均采用N+1的冗余设计,1台服务器时刻处于备用状态。因而整个系统能在99.9%的时间内提供高可用性和高稳定性的服务。
12. 高可配置性使得搜索服务能够满足不同用户的需求。在搜索调度、相关性评价、内容过滤、显示方式等方面均为客户提供了可配置手段,使系统具有很大的灵活性和适应性。ICP站点通过调用百度搜索引擎的应用编程接口(API)调用搜索服务,由他们自行决定搜索结果的显示方式,加入自己的广告和公司图标(logo)。
13. 先进的网页动态摘要显示技术。可以动态摘要显示网页中含有用户查询字串的任意位置文字,使用户阅读和判断搜索结果更方便更快捷。
14. 独有百度快照,巧妙解决了搜索用户经常遇到的死链接问题。百度搜索引擎已先预览各网站,拍下网页的快照,为用户贮存大量的应急网页。百度快照不仅下载速度极快,而且已将用户查询字串用不同颜色在网页中标记。
15. 支持多种高级检索语法,使用户查询效率更高、结果更准。已支持"+"(AND)、"-"(NOT)、"|"(OR)、"site:"、"link:",还将继续增加其它高效的搜索语法。 |
2007年05月12日 星期六 10:41 搜索引擎中用户输入查询词进行,然后搜索引擎首先要对这个查询词要进行分词。
我给现在所服务的公司写搜索引擎,界面开发程序员用asp.net实现界面,我选择了给他封装一个COM组件来对"用户查询词"进行分词。
这里存在着一个问题,分词所使用的字典是很大的,如果每次分词都要从磁盘上读取字典文件是不可取的。我发现IIS在加载一个COM后,会将此COM长期驻留在内存当中。于是我用下面的方法有效地实现了上面提到的问题:
1.申请一个很大的内存区A,供存放分词词典;
2.将加载字典部分放到了dllMain()函数中,首先判断内存区A是否为空,如果为空则到磁盘读取字典;
3.分词对象使用内存区A进行分词。
因为COM组件加载的时候总是先访问dllMain,所以保证了字典在第一时间加载,然后才能访问分词对象。
注:后来我在开源的ponyse项目中封装了一个COM组件,可以供大家免费使用: http://gforge.osdn.net.cn/projects/ponyse/ |
| | |