I am writing a search engine. Looking for talented partners, only the best. Please email [email protected](remove the _NO_SPAM)
解决方案 »
- 联通sgip长短信问题
- 请教一个简化代码的方法
- char与byte
- list集合,往里面add对象product,根据product的id值来判断,如果已经存在的,就不要add了,求一种效率比较高的判断方法!
- 请问一个IO流问题,ByteArrayInputStream类型的使用
- 求教关于NIO的问题,如何实现基于UDP的数据通信
- MYSQL的问题,在线等回复
- 再问一个简单的问题,就是怎样得到结果集中的记录数?
- 那儿能down PowerJ3.5?多谢!
- java ArrayList addAll 出现下标缺失
- 5分钟,得100分,来者有分
- 一个嗷嗷菜的问题。java语言。是用什么工具编译并执行的?visual j++是吗?先来先得分啊
谁要?
谢谢了:)
能给我一份吗?
[email protected]
呵呵,不过只我只做了语法分析这一块搜索引擎有很多类
其本身也有类似 抓取数据\清洗数据\分析数据\生成标识存放
\用户查询等等多个模块构成
网上有用Java写的搜索引擎
分析一下源码应该很有帮助不过写一个搜索引擎不仅需要编程技巧
还需要数据库方面的协同
以及人工智能方面的知识
我的email:[email protected] 共同交流。
王海瑛(宁波海峰塑化有限公司)---- 一、引言 ---- 随着Internet的飞速发展,人们越来越依靠网络来查找他们所需要的信息,但是,
由于网上的信息源多不胜数,也就是我们经常所说的"Rich Data, Poor Information"。
所以如何有效的去发现我们所需要的信息,就成了一个很关键的问题。为了解决这个问
题,搜索引擎就随之诞生。 ---- 现在在网上的搜索引擎也已经有很多,比较著名的有AltaVista, Yahoo, InfoSeek,
Metacrawler, SavvySearch等等。国内也建立了很多的搜索引擎,比如:搜狐、新浪、
北极星等等,当然由于它们建立的时间不长,在信息搜索的取全率和取准率上都有待于
改进和提高。 ---- Alta Vista是一个速度很快的搜索引擎,由于它强大的硬件配置,使它能够做及
其复杂的查询。它主要是基于关键字进行查询,它漫游的领域有Web和Usenet。支持布
尔查询的"AND","OR"和"NOT",同时还加上最相近定位"NEAR",允许通配符和"向后"搜
索(比如:你可以查找链接到某一页的所有Web站点)。你可以决定是否对搜索的短语
加上权值,在文档的什么部位去查找它们。能够进行短语查询而不是简单的单词查询的
优点是很明显的,比如,我们想要查找一个短语"to be or not to be",如果只是把它
们分解成单词的话,这些单词都是属于Stop Word,这样这个查询就不会有任何结果,
但是把它当作一个整体来查询,就很容易返回一些结果,比如关于哈姆雷特或者是莎士
比亚等等的信息。系统对查询结果所得到的网页的打分是根据在网页中所包含的你的搜
索短语的多少,它们在文档的什么位置以及搜索短语在文档内部之间的距离来决定的。
同时可以把得到的搜索结果翻译成其他的语言。 ---- Exite是称为具有"智能"的搜索引擎,因为它建立了一个基于概念的索引。当然
它所谓的"智能"是基于对概率统计的灵活应用。它能够同时进行基于概念和关键字的索
引。它能够索引Web,Usenet和分类的广告。支持"AND","OR","NOT"等布尔操作,同时
也可以使用符号"+"和"-"。缺点是在返回的查询结果中没有指定网页的尺寸和格式。 ---- InfoSeek是一个简单但是功能强大的索引,它的一个优点是有一个面向主题搜索的
可扩展的分类。你可以把你的搜索短语和相似的分类目录的主题短语相互参照,而那些
主题短语会自动加到你的查询中去。使你的搜索有更好的主题相关性。同时它也支持对
图象的查询。它能够漫游Web,Usenet,Usenet FAQs等等。不支持布尔操作,但是可以使
用符号"+"和"-"(相当于"AND"和"NOT") ---- Yahoo实际上不能称为是一个搜索引擎站点,但是它提供了一个分层的主题索引,
使你能够从一个通常的主题进入到一个特定的主题,Yahoo对Web进行了有效的组织和分
类。比如你想要建立一个网页,但是你不知道如何操作,为了在Yahoo上找到关于建立网
页的信息,你可以先在Yahoo上选择一个主题:计算机和Internet,然后在这个主题下,
你可以发现一些子主题,比如:Web网页制作,CGI编程,JAVA,HTML,网页设计等,
选择一个和你要找的相关的子主题,最终你就可以得到和该子主题相关的所有的网页
的链接。也就是说,如果你对要查找的内容属于哪个主题十分清楚的话,通过目录查
询的方法要比一般的使用搜索引擎有更好的准确率。你可以搜索Yahoo的索引,但是事
实上,你并没有在搜索整个Web。但是Yahoo提供了选项使你可以同时搜索其他的搜索引
擎,比如:Alta Vista。但是要注意的是Yahoo实际上只是对Web的一小部分进行了分类
和组织,而且它的实效性也不是很好。 ---- 搜索引擎的基本原理是通过网络机器人定期在web网页上爬行,然后发现新的网页,
把它们取回来放到本地的数据库中,用户的查询请求可以通过查询本地的数据库来得到。
如yahoo每天会找到大约500万个新的网页。 ---- 搜索引擎的实现机制一般有两种,一种是通过手工方式对网页进行索引,比如yahoo
的网页是通过手工分类的方式实现的,它的缺点是Web的覆盖率比较低,同时不能保证最
新的信息。查询匹配是通过用户写入的关键字和网页的描述和标题来进行匹配,而不是通
过全文的匹配进行的。第二种是对网页进行自动的索引,象AltaVista则是完全通过自动
索引实现的。这种能实现自动的文档分类,实际上采用了信息提取的技术。但是在分类
准确性上可能不如手工分类。 ---- 搜索引擎一般都有一个Robot定期的访问一些站点,来检查这些站点的变化,同时
查找新的站点。一般站点有一个robot.txt文件用来说明服务器不希望Robot访问的区域,
Robot 都必须遵守这个规定。如果是自动索引的话,Robot在得到页面以后,需要对该页
面根据其内容进行索引,根据它的关键字的情况把它归到某一类中。页面的信息是通过
元数据的形式保存的,典型的元数据包括标题、IP地址、一个该页面的简要的介绍,关
键字或者是索引短语、文件的大小和最后的更新的日期。尽管元数据有一定的标准,但
是很多站点都采用自己的模板。文档提取机制和索引策略对Web搜索引擎的有效性有很大
的关系。高级的搜索选项一般包括:布尔方法或者是短语匹配和自然语言处理。一个查
询所产生的结果按照提取机制被分成不同的等级提交给用户。最相关的放在最前面。每
一个提取出来的文档的元数据被显示给用户。同时包括该文档所在的URL地址。 ---- 另外有一些关于某一个主题的专门的引擎,它们只对某一个主题的内容进行搜索
和处理,这样信息的取全率和精度相对就比较高。 ---- 同时,有一类搜索引擎,它本身不用Robot去定期的采集网页。象SavvySearch 和
MetaCrawler是通过向多个搜索引擎同时发出询问并对结果进行综合返回给用户实现搜索
功能。当然实际上象SavvySearch能够对各个搜索引擎的功能进行分析和比较,根据不同
的用户查询提交给不同的搜索引擎进行处理,当然用户自己也可以指定利用哪一个搜索引擎。 ---- 一个优秀的搜索引擎必须处理以下几个问题:1 网页的分类2 自然语言的处理
3 搜索策略的调度和协作 4 面向特定用户的搜索。所以很多搜索引擎不同程度的使
用了一些人工智能的技术来解决这些方面的问题。 ---- 二、网络Spider的实现描述 ---- 现在有很多文章对Web引擎做了大量的介绍和分析,但是很少有对它们的实现做一
个详细的描述,这里我们主要来介绍一个具有基本功能的Web引擎的实现。本文,我们以
类C++语言的形式来描述Web引擎如何采集网页并存放到数据库中的过程。同时描述了如何
根据用户输入的关键字查询数据库并得到相关网页的过程。 ---- 2.1数据库结构 ---- 首先,我们要建立一个数据库表用来存放我们得到的网页。这里一般需要建立如下的表: ---- 1.字典表的建立,事实上这里是用文档中有意义的单词和它们的出现频率来代表一
个文档。 ---- 该表(WordDictionaryTbl)主要要包括三个字段,主要是用来存放和一个网页
相关的单词的情况 url_id 对每一个URL的唯一的ID号
word 该URL中的经过stem的单词
intag 该单词在该网页中的出现的次数---- 2.存储每一个URL信息的表 ---- 该表(URLTbl)中主要的关键字段有:rec_id 每一条记录的唯一的ID号
status 得到该URL内容的状态,比如HTTP_STATUS_TIMEOUT表示
下载网页的最大允许超时
url URL的字符串名称
content_type 内容的类型
last_modified 最新的更改时间
title 该URL的标题
docsize 该URL的文件的尺寸
last_index_time 最近一次索引的时间
next_index_time 下一次索引的时间
tag 对于网页,用来表示它的类型,比如:是text,或者是html,
或者是图片等等
hops 得到文件时候的曾经失败的次数
keywords 对于网页,和该网页相关的关键字
description 对于网页,指网页的内容的描述
lang 文档所使用的语言---- 3.因为网页中有很多单词是一些介词和语气助词或者是非常常用的常用词,它
们本身没有多少意义。比如:英语中的about,in,at,we,this等等。中文中的如"和",
"一起","关于"等等。我们统一的把它们称为停止词(stop word)。所以我们要建立
一个表,来包括所有这些停止词。该表(StopWordTbl)主要有两个字段。
word char(32) 表示那些停止词
lang char(2) 表示所使用的语言---- 4.我们要建立一个关于robot的表,我们在前面说过,所有的网站一般都有一个
robot.txt文件用来表示网络上的robot可以访问的权限。该表(RobotTbl)主要有以下字段。
hostinfo Web站点主机的信息
path 不允许robot访问的目录---- 5.建立我们需要屏蔽的那些网页(比如一些内容不健康的或者没有必要去搜索的
站点)的一张表(ForbiddenWWWTbl),主要的字段就是网页的URL。 ---- 6.另外我们需要建立一个我们所要得到的文件类型的表(FileTypeTbl),比如,
对于一个简单的Web搜索引擎,我们可能只需要得到后缀为.html,htm,.shtml和txt的
类型文件。其他的我们只是简单的忽略它们。主要的字段就是文件的类型和说明。 ---- 其中关于停止词的表的内容是我们要实现要根据各种语言的统计结果,把那些
意义不大的单词放进去。关于文档单词、URL和Robot的表的内容都是在获取Web网页的
时候动态增加记录的。 ---- 2.2 具体网页获取算法描述 ---- 具体的网页的获取步骤是这样的: ---- 我们可以设定我们的搜索程序最大可以开的线程的数目,然后这些线程可以同时
在网上进行搜索,它们根据数据库中已有的关于网页的信息,找出那些需要更新的网页
(如何判断哪些网页需要更新是一个值得研究的过程,现在有很多启发式和智能的算法,
基本上是基于统计规律进行建模。最简单的当然是设定一个时间范围,在某个时间范围以
前的网页被重新去搜索一遍),然后判断那些网页是否在屏蔽表中,如果是的话,就从
关于URL的表中删除该条记录。否则,我们就到相应的WWW站点去得到URL指定的文件(这
里需要注意的是根据不同的URL的特点,需要使用不同的
typedef struct href_struct {
char *href; //该链接的名称
int hops; //发生的跳转次数
int stored; //是否已经存储到数据库中
} HREF;
---- 所有需要更新的和新产生的URL都被放到这个结构中,当它的数量超过一定
的范围以后,被一次性的存入数据库。
---- 关于URL的一个数据结构如下: typedef struct url {
char *schema; //表示该URL是通过什么协议得到的,比如HTTP,
FTP,NNTP等。
char *specific; //主机的名称加上路径
char *hostinfo; //主机的名称加上相关的协议端口
char *hostname; //主机的名称
char *path; //在主机的具体的路径
char *filename; //文件的名称
char *anchor; //相关的anchor
int port; //协议相关的端口
} URL;---- 这是针对URL的一些相关的属性的描述的一个数据结构。事实上在数据库中,
我们存储的只是对网页的描述和对一些文本和HTML页面的关键词的索引信息。我们
并不存储网页的实际的内容。
---- 三、用户查询实现描述 ---- 关于对用户提交的查询请求的实现分析: ---- 用户想要查询某一方面的信息一般都是通过提供和该领域相关的几个关键字来进行的。---- 我们来看一下关于用户查询的相关的数据结构和类: ---- 下面是一个关于单词和它的权值的基本结构: typedef struct word_weight_pair
{
char word[WORD_LEN];
int weight;
}word_weight_pair;
---- 下面的类主要是用来对用户的查询进行处理和分析:
Class CUserQuery
{
char m_UserQuery[MAX_QUERYLEN]; //用户的查询表达式
CPtrArray word_weight_col;
//是关于结构word_weight_pair的动态数组
int m_maxReturnSum; //用户希望返回的最多的网页数
int search_mode;
CObArray m_returnDoc; //是关于CNetDocument对象的一个动态数组
NormalizeWord(char* OneWord); //对单词进行归整化,即Stem.
Find(char* odbcName); //进行数据库查找和匹配
};---- 系统实现的基本的步骤如下: ---- 1.对用户输入的查询表达式进行分析。事实上,我们在前面的Spider搜索过
程中对文档的表示是通过关键字形式描述的,每一个文档可以表示为这样的一个集合 其中 ::=< 单词或短语名称 >< 单词或短语的权值 >---- 实际上就是采用矢量空间的表示方法来表示的文档。 ---- 我们对用户输入的查询表达式也采用矢量空间的表示方法。我们认为用户输入的
关键字的顺序代表了它的重要性的程度,所以对于位置靠前的单词有相对比较高的优先
级,同时我们对所有的内容以短语或者是单词为最小原子,进行Stem操作,即象前面
所提到的:比如单词Encouraging就转化成Encourage的格式。然后去掉那些Stop Word,
比如is ,as等等的单词,这些单词存放在StopWordTbl表中。 然后把所有归整化后的内容
放入动态数组word_weight_col中去。 ---- 2.对于动态数组word_weight_col中的每一个元素,即结构word_weight_pair(包
括单词和该单词的权重),我们从表WordDictionaryTbl中可以找到和这些单词相关的记
录,这些记录应该是包括了所有的在word_weight_col中的单词。 ---- 进行网页是否和查询相匹配的计算。匹配计算的过程如下:首先我们对所有的记
录按URL地址进行排序。因为可能好几条记录对应的是一个URL,然后对每一个网页进
行打分,每一条记录的单词权值为INITSCORE*WEIGHT+(TOTALTIMES-1)*WEIGHT* INCREMENT。
其中INITSCORE为每一个单词的基准分数,TOTALTIMES为该单词在网页中的出现的次数,
WEIGHT是该单词在不同的内容段出现有不同的权值(比如在KEYWORD段,或者是标题段,
或者是内容段等等)。INCREMENT是该单词每多出现一次所增加的分数。 ---- 3.根据用户指定的m_maxReturnSum,显示匹配程度最高的前m_maxReturnSum页。 ---- 四、结束语 ---- 我们利用上面所讨论的机制,在WINDOWS NT操作系统下,用VC++和SQL SERVER实现了
一个Web搜索引擎的网页搜集过程。在建立了一个基本的搜索引擎的框架以后,我们可以
基于这个框架,实现一些我们自己设计的算法,比如如何更好的进行Spider的调度,如何更
好的进行文档的归类,如何更好的理解用户的查询,用来使Web搜索引擎具有更好的智能性
和个性化的特点。
良好的应用于大型环境下的中文语言检索(CLS,Chinese Language Search)已经有IBM的中国研究中心做出来了,包括了对同义词,近义词,相同名称(江泽民和江总书记可以获得一样的命中),下位概念(自然灾害对应洪水,地震等)的特殊处理。也包括了自然语言检索,近似结果的排除等功能,而且也已经可以应用在非NT环境了(NT环境有多差我就不说了)我觉得现在我们需要的是一个桌面环境下的,用来管理个人文档时的小型搜索引擎。
这个可以理解为知识管理系统中的一部分
这类软件应该作为企业门户的一部分
有共享性和定制的灵活性,这样在日常工作中很实用
企业门户或是CRM之类的项目实施中都会有这样一个模块