您的位置:首页 > 编程语言 > Java开发

基于JAVA技术的搜索引擎的研究与实现

2006-09-17 10:04 597 查看
基于

目录............................................................................................................................................................................ 1
摘要............................................................................................................................................................................ 3
第一章............................................................................................................................................................. 4
第二章........................................................................................................................................ 5
2.1........................................................................................................................................................... 5
2.2............................................................................................................................................... 5
2.2.1服务器............................................................................................................................................. 6
2.3........................................................................................................................... 6
2.4................................................................................................................................................................... 6
第三章................................................................................................................................................ 7
3.1........................................................................................................................................... 7
3.2................................................................................................................................... 7
3.2.1HTML........................................................................................................................................ 7
3.2.2 SpiderSpider................................................................................................................................. 11
3.2.5............................................................................................................................. 12
3.3................................................................................................................................................................ 14
第四章lucene.................................................................................................................. 15
4.1Lucene............................................................................................................................ 15
4.2Lucene的原理分析............................................................................................................................ 15
4.2.2 Lucene.................................................................................................................................. 17
4.3LuceneSpider的结合........................................................................................................................ 18
4.4................................................................................................................................................................ 21
第五章TomcatWeb................................................................................................................. 22
5.1TomcatWeb............................................................................................................ 22
5.2................................................................................................................................................ 22
5.3.1Tomcat................................................................................................................................. 25
5.4................................................................................................................................................................ 25
第六章.......................................................................................................................................... 26
6.1................................................................................................................................................................ 26
6.2.................................................................................................................................... 26
6.2.1............................................................................................................................ 27
6.3................................................................................................................................................................ 27
参考文献................................................................................................................................................................. 28






网络中的资源非常丰富,但是如何有效的搜索信息却是一件困难的事情。建立搜索引擎就是解决这个问题的最好方法。本文首先详细介绍了基于英特网的搜索引擎的系统结构,然后从网络机器人、索引引擎、
新闻搜索引擎是从指定的
本人在介绍搜索引擎的章节中除了详细的阐述技术核心外还结合了新闻搜索引擎的实现代码来说明,图文并茂、易于理解。

Abstract
The resources in the internet are abundant, but it is adifficult job to search some useful information. So a search engine is the bestmethod to solve this problem. This article fist introduces the system structureof search engine based on the internet in detail, then gives a minuteexplanation form Spider search, engine and web server. In order to understandthe technology more deeply, I have programmed a news search engine by myself.
The news search engine is explained and searchedaccording to hyperlink from a appointed web page, then indexs every searchedinformation and adds it to the index database. Then after receiving thecustomers' requests from the web server, it soon searchs the right news formthe index engine,
In the chapter of introducing search engine, it is notonly elaborate the core technology, but also combine with the moderncode,pictures included, easy to understand.

面对浩瀚的网络资源,搜索引擎为所有网上冲浪的用户提供了一个入口,毫不夸张的说,所有的用户都可以从搜索出发到达自己想去的网上任何一个地方。因此它也成为除了电子邮件以外最多人使用的网上服务。
搜索引擎技术伴随着
第一代搜索引擎出现于
大约在
2000
搜索引擎一词在国内外因特网领域被广泛使用,然而他的含义却不尽相同。在美国搜索引擎通常指的是基于因特网的搜索引擎,他们通过网络机器人程序收集上千万到几亿个网页,并且每一个词都被搜索引擎索引,也就是我们说的全文检索。著名的因特网搜索引擎包括

2.1

2.2

服务器
客户一般通过浏览器进行查询,这就需要系统提供
2.3

召回率:一次搜索结果中符合用户要求的数目与用户查询相关信息的总数之比
准确率:一次搜索结果中符合用户要求的数目与该次搜索结果总数之比
相关度:用户查询与搜索结果之间相似度的一种度量
精确度:对搜索结果的排序分级能力和对垃圾网页的抗干扰能力
2.4

网络机器人又称为
基于因特网的搜索引擎是
网络机器人还可以通过扫描
3.2
Internet
3.2.1
因为
文本:除了脚本和标签之外的所有数据 注释:程序员留下的说明文字,对用户是不可见的 简单标签:由单个表示的HTML标签 开始标签和结束标签:用来控制所包含的HTML代码
我们在进行解析的时候不用关心所有的标签,只需要对其中几种重要的进行解析即可。
超连接标签
超连接定义了

图像映射标签
图像映射是另一种非常重要的标签。它可以让用户通过点击图片来迁移到新的页面中。
表单标签
表单是
表格标签
表格是
我们在具体解析这些
Bot
HTMLPage构造函数 构造对象并指定用于通讯的HTTP对象
Public HTMLPage(HTTP http) GetForms方法 获取最后一次调用Open方法检索到的表单清单
Public Vector getForms() GetHTTP方法 获取发送给构造函数的HTTP对象
Public HTTP getHTTP() GetImage方法 获取指定页面的图片清单
Public Vector getImage() GetLinks方法 获取指定页面的连接清单
Public Vector getLinks() Open方法 打开一个页面并读入该页面,若指定了回调对象则给出所有该对象数据
Public void open(String url,HTMLEditorKit.ParserCallback a)
3.2.2
网络机器人必须从一个网页迁移到另一个网页,所以必须找到该页面上的超连接。程序首先解析网页的
递归结构
递归是在一个方法中调用自己本身的程序设计技术。虽然比较容易实现但耗费内存且不能使用多线程技术,故不适合大型项目。
非递归结构
这种方法使用队列的数据结构,当
虽然这里只描述了一个队列,但在实际编程中用到了四个队列,他们每个队列都保存着同一处理状态的

等待队列 在这个队列中,URL等待被Spider程序处理。新发现的URL也被加入到这个队列中
处理队列 当Spider程序开始处理时,他们被送到这个队列中
错误队列 如果在解析网页时出错,URL将被送到这里。该队列中的URL不能被移入其他队列中
完成队列 如果解析网页没有出错,URL将被送到这里。该队列中的URL不能被移入其它队列中
在同一时间

以上的图表示了队列的变化过程,在这个过程中,当一个
3.2.3
在构造
流程图如下所示:

IspiderReportable
这是一个必须实现的接口,可以通过回调函数接受
public interface IspiderReportable{
public boolean foundInternalLink(String url);
public boolean foundExternalLink(String url);
public boolean foundOtherLink(String url);
public void processPage(HTTP page);
public void completePage(HTTP page,boolean error);
public boolean getRemoveQuery();
public void SpiderComplete(); }
3.2.4
Internet
Java
线程是通过程序的一条执行路线。多线程是一个程序同时运行多个任务的能力。它是在一个程序的内部进行分工合作。
优化程序的通常方法是确定瓶颈并改进他。瓶颈是一个程序中最慢的部分,他限制了其他任务的运行。据个例子说明:一个
数据库技术

3.2.5
程序结构图如下:

程序代码实现如下:
package news; /** * 新闻搜索引擎 * 版本 1.0 */
import com.heaton.bot.HTTP;
import com.heaton.bot.HTTPSocket;
import com.heaton.bot.ISpiderReportable;
import com.heaton.bot.IWorkloadStorable;
import com.heaton.bot.Spider;
import com.heaton.bot.SpiderInternalWorkload; /** * 构造一个Bot程序 */
public class Searcher implements ISpiderReportable {
public static void main(String[] args)
throws Exception { IWorkloadStorable wl = new SpiderInternalWorkload();
Searcher _searcher = new Searcher();
Spider _spider = new Spider(_searcher, "http://127.0.0.1/news.htm", new HTTPSocket(), 100, wl); _spider.setMaxBody(100);
_spider.start(); } // 发现内部连接时调用,url表示程序发现的URL,若返回true则加入作业中,否则不加入。
public boolean foundInternalLink(String url) {
return false; } // 发现外部连接时调用,url表示程序所发现的URL,若返回true则把加入作业中,否则不加入。
public boolean foundExternalLink(String url) {
return false; } // 当发现其他连接时调用这个方法。其他连接指的是非HTML网页,可能是E-mail或者FTP
public boolean foundOtherLink(String url) {
return false; } // 用于处理网页,这是Spider程序要完成的实际工作。
public void processPage(HTTP http) {
System.out.println("扫描网页:" + http.getURL());
new HTMLParse(http).start(); } // 用来请求一个被处理的网页。
public void completePage(HTTP http, boolean error) { } // 由Spider程序调用以确定查询字符串是否应删除。如果队列中的字符串应当删除,方法返回真。
public boolean getRemoveQuery() {
return true; } // 当Spider程序没有剩余的工作时调用这个方法。
public void spiderComplete() { }
}
3.3
在本章中,首先介绍了网络机器人的基本概念,然后具体分析了
本人在编程中运用了

4.1
Lucene
4.2 Lucene

Lucene
总体上看:可以先把
索引数据源:doc(field1,field2...) doc(field1,field2...) / indexer / _____________ | Lucene Index| -------------- searcher /
结果输出:Hits(doc(field1,field2) doc(field1...))
Document:一个需要进行索引的“单元”,一个Document由多个字段组成
Field:字段
Hits:查询结果集,由匹配的Document组成
通常书籍后面常常附关键词索引表(比如:北京:
由于数据库索引不是为全文索引设计的,因此,使用
由此可以看出模糊查询相对数据库的精确查询是一个非常不确定的问题,这也是大部分数据库对全文检索支持有限的原因。
 
Lucene全文索引引擎
数据库
索引
将数据源中的数据都通过全文索引一一建立反向索引
对于LIKE查询来说,数据传统的索引是根本用不上的。数据需要逐个便利记录进行GREP式的模糊匹配,比有索引的搜索速度要有多个数量级的下降。
匹配效果
通过词元(term)进行匹配,通过语言分析接口的实现,可以实现对中文等非英语的支持。
使用:like "%net%" 会把netherlands也匹配出来, 多个关键词的模糊匹配:使用like "%com%net%":就不能匹配词序颠倒的xxx.net..xxx.com
匹配度
有匹配度算法,将匹配程度(相似度)比较高的结果排在前面。
没有匹配程度的控制:比如有记录中net出现5词和出现1次的,结果是一样的。
结果输出
通过特别的算法,将最匹配度最高的头100条结果输出,结果集是缓冲式的小批量读取的。
返回所有的结果集,在匹配条目非常多的时候(比如上万条)需要大量的内存存放这些临时结果集。
可定制性
通过不同的语言分析接口实现,可以方便的定制出符合应用需要的索引规则(包括对中文的支持)
没有接口或接口复杂,无法定制
结论
高负载的模糊查询应用,需要负责的模糊查询的规则,索引的资料量比较大
使用率低,模糊匹配规则简单或者需要模糊查询的资料量少
对于中文来说,全文索引首先还要解决一个语言分析的问题,对于英文来说,语句中单词之间是天然通过空格分开的,但亚洲语言的中日韩文语句中的字是一个字挨一个,所有,首先要把语句中按
首先,肯定不能用单个字符作(si-gram)
基于自动切分的最大优点是没有词表维护成本,实现简单,缺点是索引效率低,但对于中小型应用来说,基于
自动切分
词表切分
实现
实现非常简单
实现复杂
查询
增加了查询分析的复杂程度,
适于实现比较复杂的查询语法规则
存储效率
索引冗余大,索引几乎和原文一样大
索引效率高,为原文大小的30%左右
维护成本
无词表维护成本
词表维护成本非常高:中日韩等语言需要分别维护。 还需要包括词频统计等内容
适用领域
嵌入式系统:运行环境资源有限 分布式系统:无词表同步问题 多语言环境:无词表维护成本
对查询和存储效率要求高的专业搜索引擎
4.3 Lucene
首先构造一个

代码分析如下:
package news; /** * 新闻搜索引擎 * * 版本1.0
*/ import java.io.IOException;
import org.apache.lucene.analysis.cn.ChineseAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;

public class Index {
IndexWriter _writer = null;
Index() throws Exception {
_writer = new IndexWriter("c://News//index",new ChineseAnalyzer(), true);
} /** * 把每条新闻加入索引中 * @param url 新闻的url * @param title 新闻的标题 * @throws java.lang.Exception */
void AddNews(String url, String title) throws Exception {
Document _doc = new Document();
_doc.add(Field.Text("title", title));
_doc.add(Field.UnIndexed("url", url));
_writer.addDocument(_doc); } /**优化并且清理资源 @throws java.lang.Exception */ void close() throws Exception {
_writer.optimize();
_writer.close(); }
}
然后构造一个

代码分析如下:
package news; /** * 新闻搜索引擎 * 版本1.0 */
import java.util.Iterator;
import java.util.Vector;
import com.heaton.bot.HTMLPage;
import com.heaton.bot.HTTP;
import com.heaton.bot.Link;

public class HTMLParse {
HTTP _http = null;
public HTMLParse(HTTP http) { _http = http; } /**对Web页面进行解析后建立索引*/ public void start() {
try { HTMLPage _page = new HTMLPage(_http);
_page.open(_http.getURL(), null);
Vector _links = _page.getLinks();
Index _index = new Index();
Iterator _it = _links.iterator();

int n = 0;
while (_it.hasNext()) {
Link _link = (Link) _it.next();
String _herf = input(_link.getHREF().trim());
String _title = input(_link.getPrompt().trim());
_index.AddNews(_herf, _title);
n++;
}
System.out.println("共扫描到" + n + "条新闻");
_index.close();
}
catch (Exception ex) {
System.out.println(ex); }
} /** * 解决java中的中文问题 * @param str 输入的中文 * @return 经过解码的中文 */ public static String input(String str) {
String temp = null;
if (str != null) {
try {
temp = new String(str.getBytes("ISO8859_1"));
}
catch (Exception e) { }
}
return temp;
}
}
4.4
在进行海量数据搜索时,如果使用单纯的数据库技术,那将是非常痛苦的。速度将是极大的瓶颈。所以本章提出了使用全文搜索引擎
最后,还结合了具体代码说明了如何把

基于服务器
5.1服务器
Web
Tomcat
5.2
5.3.1
一个良好的查询界面非常重要,例如

搜索结果截图如下:

5.3.2
主要利用
服务端

实现的关键代码如下:
public void Search(String qc, PrintWriter out) throws Exception { // 从索引目录创建索引 IndexSearcher _searcher = new IndexSearcher("c://news//index"); // 创建标准分析器
Analyzer analyzer = new ChineseAnalyzer(); // 查询条件

String line = qc; // Query是一个抽象类
Query query = QueryParser.parse(line, "title", analyzer);
out.println("<html>");
out.println("<head><title>搜索结果</title></head>");
out.println("<body bgcolor=#ffffff>");
out.println("<center>" + "<form action='/NewsServer/results' method='get'>" + "<font face='华文中宋' color='#3399FF'>新闻搜索引擎</font>:" + "<input type='text' name='QueryContent' size='20'>" + "<input type='submit' name='submit' value='开始搜索'>" + "</form></center>" );
out.println("<p>搜索关键字:<font color=red>" + query.toString("title") + "</font></p>");
Hits hits = _searcher.search(query);
out.println(" 总共找到<font color=red>" + hits.length() + "</font>条新闻<br>");
final int HITS_PER_PAGE = 10;
for (int start = 0; start < hits.length(); start += HITS_PER_PAGE) {
int end = Math.min(hits.length(), start + HITS_PER_PAGE);
for (int i = start; i < end; i++) {
Document doc = hits.doc(i);
String url = doc.get("url");
if (url != null) {
out.println( (i + 1) + " <a href='" + url + "'>" +replace(doc.get("title"), qc) +"</a><br>");} else {
System.out.println("没有找到!");
}
}
}
out.println("</body></html>");
_searcher.close(); };
5.3
Tomcat

5.4
本章中详细介绍了如何构架基于
搜索引擎策略
6.1
随着信息多元化的增长,千篇一律的给所有用户同一个入口显然已经不能满足特定用户更深入的查询需求。同时,这样的通用搜索引擎在目前的硬件条件下,要及时更新以得到互联网上较全面的信息是不太可能的。针对这种情况,我们需要一个分类细致精确、数据全面深入、更新及时的面向主题的搜索引擎。
由于主题搜索运用了人工分类以及特征提取等智能化策略,因此它比上面提到的前三代的搜索引擎将更加有效和准确,我们将这类完善的主题搜索引擎称为第四代搜索引擎。

6.2

导向词就是一组关键词,它们会引导搜索器按照一定顺序搜索整个网络,使得搜索引擎可以在最短的时间里面得到最全面的跟某一个主题相关的信息。通过设置导向词以及它们对应的不同权值,所有标题、作者、正文或超连接文本中含有某一导向词的网页都会被赋予较高的权值,在搜索的时候会优先考虑。搜索器在向主控程序获得

6.2.2
在考虑一个网页被另一个网页的引用时候,不是单纯的将被引用网页的
最早提出网页评分的计算方法是

按照以上的用户行为模型,每个网页可能被访问到的次数就是该网页的链接权值。如何计算这个权值呢?

其中

权威网页
顾名思义,是给定主题底下的一系列重要的权威的网页。其重要性和权威性主要体现在以下两点:

由此可见,权威网页对于主题搜索引擎的实现有很重大的意义。主题搜索引擎一个很关键的任务就是从互联网上无数的网页之中最快最准的找出这些可数的权威网页,并为他们建立索引。这也是有效区别主题搜索引擎和前三代传统通用搜索引擎的重要特征。
中心网页
是包含很多指向权威网页的超链接的网页。最典型中心网页的一个例子是
权威网页和中心网页之间是一种互相促进的关系:一个好的中心网页必然要有超链接指向多个权威网页;一个好的权威网页反过来也必然被多个中心网页所链接。

6.3
本章介绍了面向主题的搜索策略,并作了详细阐述。虽然在新闻搜索中并没有应用到搜索策略,但是对于

文献资料

开发工具、平台及资源:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: