聚合搜索 Meta Search实践

概述 聚合搜索初步定义为个性化“元搜索”,同时将信息聚合在一起实现网络工具化、个性化的发展需求;提升网络使用效率,让用户更快 地从繁复的搜索系统里解放出来,让上网搜索更轻松有效。本程序针对常用的GoogleBaiduBing等搜索引擎进行了聚合其搜索结果 的实践,实现了元搜索最低要求。聚合的搜索结果将以网页的形式展示出来,并且实现其中的链接可用性。 一、完成一个聚合搜索引擎的基本步骤 1. 获取GoogleBaiduBing等搜索引擎进行网页搜索时的查询URL模式。 2. 分析各家搜索引擎返回的搜索结果的模式,每个结果定义为一个有效的Item对象。 3. 对提取到所有Item对象进行去重重排序聚合。 4. 回写聚合结果文件,调用浏览器打开。 二、各步的具体操作及其说明 1.获取GoogleBaiduBing等搜索引擎进行网页搜索时的查询URL模式。 通过在各家搜索引擎提供搜索服务的检索框里输入查询的字串,点击查询后,查看浏览器中的地址栏中的URL模式,即可获得各家搜索引擎 的查询URL模式。以下是以“5sing”为查询关键字获取到的几家主流搜索引擎的查询URL模式。 Google http://www.google.com.hk/search?q=5sing Baidu http://www.baidu.com/s?wd=5sing Bing http://hk.bing.com/search?q=5sing Yahoo http://www.yahoo.cn/s?q=5sing 2.分析各家搜索引擎返回的搜索结果的模式,每个结果定义为一个有效的Item对象。 通过第1步获得的查询URL,可以通过编程获取到各家搜索引擎对相应查询关键字返回结果。返回的结果以HTTP协议为标准。想要从返回 的结果中提取出有效的结果,需要使用正则表达式过滤其中的无效部分,并将获取到的每一个结果都封装为一个Item对象。通过分析获 得各家搜索引擎返回结果中有效的Item模式(正则表达式): Google <li class=\"g\"><h3 class=\"r\">.+?</li> Baidu <table.+?><tr><td.+?><h3.+?>.+?</div></td></tr></table> Bing <li class=\"sa_wr.+?\">.+?</div></div></li> Yahoo <li class=\"record.+?\">.+?<h3 class=\"title\">.+?</li> 通过以上的正则表达式即可将对应搜索引擎返回的查询结果中的有效条目提取出来,并将每一个条目都封装为一个Item对象。Item对象 保存了该条目的几个重要属性,如下: • Engine — 该条目来自与那个搜索引擎 • Content — 该条目在搜索引擎中的内容信息,包括相应的布局和格式 • keyString — 该条目在出去了HTML布局和格式之后剩下的关键信息 • Sequence — 该条目在搜索引擎中返回结果中的排序,编号从0开始 • Score — 该条目在搜索引擎中得分,所有Item初始化为同一个值1.2 3. 对提取到所有Item对象进行去重重排序聚合。 在从各家搜索引擎提取到所有的Item之后,因为各家搜索引擎中返回的Item中存在不好重复的内容,所以首先需要对所有的Item进行 相似性检测,并将相似性很高的Item以某种方式删除,并保留其中一个的Item,这个过程称为Item去重过程。在进行Item去重的时, 同时也要对Item的score值进行操作,为去重之后的重排序工作做好准备。 3.1相似性检测 在定义两个Item是否相似时,使用Item的keyString属性进行字符串相似性检测。检测算法的基本思想如下。 两个字符串A和B,假设B是字符串长度较短的一个,B的长度为k。定义一个count变量来记录B的所有子串在A中出现后积累获得相似性 权重。出现将字符串B的字符串值分段截取出来,并保持截取的字符串在B中的顺序不变,截取的模式为C = subString( i,j ) , 其中 0 <= i < k,i <= j < k。 获得C之后检测A是否包含C,若包含C,则count值加(ji).B的所有子串都检测完毕后,将count值与B的所有字串数想除,得到 rate = count / ( (k + 1) * k /2), rate即为BA的相似性的度量。根据经验来看,当rate值大于2.7时,说明BA相似度很高,在聚合的时候应该删除其中一个,并 且为了保留更多的信息,这里选择删除B,而保留A3.2 重新为Itemscore属性赋值 在删除B的同时,必须意识到能够删除B,说明AB所指向的信息不同搜索引擎都检测到了,暗示删除B之后,A信息的score值需要提升, 而非保持初始化值。在对score重新复制时,同时也必须考虑该Item在搜索引擎返回结果中排名,即sequence所记录的信息。基于此, 定义了score新值的计算方式。 Score = A.score * (A所属引擎返回的Item总数 — A.sequence) / (A.sequence + 1) + B.score * (B所属引擎返回的Item总数 — B.sequence) / (B.sequence + 1). 新得到的score值将作为回写result时排序的第一依据,score值越大,则排名越靠前。若score相同,则再查看sequence属性,sequence 越小,排名越靠前;若scoresequence都相同,则比较keyString的长度,长度越长,信息量越大,排名越靠前。 4. 回写结果文件,调用浏览器打开查看 以“5sing”为查询关键字为例,程序运行结果截图如下:
三、不足
在具体实现时只使用了Baidu和Bing两家搜索引擎;
聚合算法没有进行跟大规模的数据验证,使用经验规则来判定的聚合结果显得略有粗糙;
使用JavaSE平台编程,没有充分利用JavaEE平台上对网页处理更为友好资源。

参考文献
1. 美 Cormen,T.H等著;殷建平等译 《算法导论(原书第3版)》 北京:机械工业出版社
2. 罗刚 著 《自己动手写网络爬虫》 北京:清华大学出版社

Source files @ https://github.com/Shushier/MetaSearchEngineDemo

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


什么是设计模式一套被反复使用、多数人知晓的、经过分类编目的、代码 设计经验 的总结;使用设计模式是为了 可重用 代码、让代码 更容易 被他人理解、保证代码 可靠性;设计模式使代码编制  真正工程化;设计模式使软件工程的 基石脉络, 如同大厦的结构一样;并不直接用来完成代码的编写,而是 描述 在各种不同情况下,要怎么解决问题的一种方案;能使不稳定依赖于相对稳定、具体依赖于相对抽象,避免引
单一职责原则定义(Single Responsibility Principle,SRP)一个对象应该只包含 单一的职责,并且该职责被完整地封装在一个类中。Every  Object should have  a single responsibility, and that responsibility should be entirely encapsulated by t
动态代理和CGLib代理分不清吗,看看这篇文章,写的非常好,强烈推荐。原文截图*************************************************************************************************************************原文文本************
适配器模式将一个类的接口转换成客户期望的另一个接口,使得原本接口不兼容的类可以相互合作。
策略模式定义了一系列算法族,并封装在类中,它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
设计模式讲的是如何编写可扩展、可维护、可读的高质量代码,它是针对软件开发中经常遇到的一些设计问题,总结出来的一套通用的解决方案。
模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中,使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
迭代器模式提供了一种方法,用于遍历集合对象中的元素,而又不暴露其内部的细节。
外观模式又叫门面模式,它提供了一个统一的(高层)接口,用来访问子系统中的一群接口,使得子系统更容易使用。
单例模式(Singleton Design Pattern)保证一个类只能有一个实例,并提供一个全局访问点。
组合模式可以将对象组合成树形结构来表示“整体-部分”的层次结构,使得客户可以用一致的方式处理个别对象和对象组合。
装饰者模式能够更灵活的,动态的给对象添加其它功能,而不需要修改任何现有的底层代码。
观察者模式(Observer Design Pattern)定义了对象之间的一对多依赖,当对象状态改变的时候,所有依赖者都会自动收到通知。
代理模式为对象提供一个代理,来控制对该对象的访问。代理模式在不改变原始类代码的情况下,通过引入代理类来给原始类附加功能。
工厂模式(Factory Design Pattern)可细分为三种,分别是简单工厂,工厂方法和抽象工厂,它们都是为了更好的创建对象。
状态模式允许对象在内部状态改变时,改变它的行为,对象看起来好像改变了它的类。
命令模式将请求封装为对象,能够支持请求的排队执行、记录日志、撤销等功能。
备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。 基本介绍 **意图:**在不破坏封装性的前提下,捕获一个对象的内部状态,并在该
顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为
享元模式(Flyweight Pattern)(轻量级)(共享元素)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结