SSH技术交流联盟1:57701299
SSH技术交流联盟2:62318889
SSH技术交流联盟3:33734481
SSH技术交流联盟4:43786922
SSH技术交流联盟5 30668114
(2009-05-25 18:41)
(2009-05-19 14:05)
此篇博文介绍我实现过的一个垂直搜索引擎---搜游。搜游是一个游戏装备账号等游戏信息交易的搜索引擎,目前搜索的信息主要是游戏:天龙八部的。主要技术由Struts2+Hibernate+Spring+Compass+HtmlParser+Heritrix实现。
系统具有抓取信息,信息提取,批量插入,单条插入,增量索引,搜索高亮命中,分词等功能。以下是首页截图:

搜索效果:

(2009-01-16 17:02)
从上周就开始想写这篇文章,一直被compass的东西困扰,下面介绍一下Heritrix的定制,由于配置和简单的抓取在网上有很多资料,在此不再赘述。
Heritrix是一个功能强大的java开源可扩展爬虫,其他的类似爬虫很多,比较出名的有Nutch。在介绍扩展Heritrix之前,先解决一下中文种子URI的解决方法,如果出现这种情况,将抓取不到我们想要的数据,Heritrix会把中文认为是乱码,我们需要先转码,比较方便的是使用JS的encodeURI方法,生成带有很多%的地址,之后就可以抓取了。
由于我们要的数据往往是具有某些特征的URI,而不是默认的把整个网站的数据全部收录,所以我们需要定制我们自己的FrontierScheduler,需要自己写一个类来继承FrontierScheduler,处理的代码写在schedule(CandidateURI
caUri)方法中,然后判断一下我们需要的URI的前缀,筛选出需要的URI的格式,例如:
前天面完搜狐游戏,现在是做梦都能梦到自己拿offer,虽然面了30-35分钟(带表了),但是感觉当时有些技术没有说,又点遗憾,包括SOA架构,OSEM,IR,Heritrix等。哎~估计是精神病早期了,昨天来个010开头的电话,我兴奋的心脏到了嗓子眼,但谁知是三星的电话面试。与其抱着电话苦等,还不如继续发篇博文,下面说一下我所了解的java
web系统的优化,简化代码和提高安全性的方法,如果网友有更好的方法或者是补充可以回复,欢迎广大网友拍砖。
1.静态化:这是页面优化的技术,包括Freemarker,Velocity等模板技术,说白了它们就是类似于填空似的技术,有点类似国际化的实现,Velocity具有定义宏的功能,可以在分页的时候节省一定的代码量。模板技术实现的网站比较容易被爬虫抓取。
2,缓存策略:说实话这部分我也在摸索中,欢迎网友拍我哈。缓存是一个很有效的提高效率的手段,缓存可以在web层实现,这也解决了在逻辑层难于实现的问题,越是上层性能越好,这样就可以不用调用底层的服务了。缓存地点有两个,内存和静态页面。对于页面变化比较慢活数据更新不要求特别及时的可以缓存页面到内存,这里要提一个GZip
最近这一段时间可以一波N折来形容了,这段校园招聘高峰基本过去了,一共算是拿了四个offer,就第一个是满意的,但是莫名的解约了,让我确实郁闷了一阵子。之后的三个offer都有一些不太满意的地方,都拒绝了,到现在弄个高不成,低不就的境况。但是再忙也不能把技术放下,呵呵!下面来说一下目前稍大一点的公司都在使用的SOA以及很容易被混淆的web
service.
首先,SOA和web
service有很都相同的地方,比如:都是提供服务的,服务接口都是基于开发的,服务接口和服务的具体实现是分离的等。重点来看一下它们的区别:web
service的服务接口对具体的服务实现进行了封装,从而使客户端不知道服务是如何实现的。服务接口需要绑定具体实现服务的服务组建来实现服务。当然,它也有一定的缺点,客户端调用web
service组件时,需要知道web
service的具体位置和传输协议,这就造成了一定的不灵活性,只是实现了一定程度的抽象;SOA架构只和服务接口进行绑定,对服务接口实现了封装,当客户端通过SOA调用服务时,不需要知道真正的服务提供者,服务位置和传输协议,SOA实现了更高程度的抽象,是一种具有更高灵活性的架构。
&nbs
终于抽出时间来写篇技术文章了,这几天和未来几天估计都要在招聘宣讲会和基础知识复习中度过了,好了,还是进入正题吧。
在Lucene中,最繁琐的工作是对数据源分词,计算出现的频率和位置,以及写索引的过程,这些都是由DocumentWriter处理的。先来简单的了解一下索引建立的全过程,索引建立之前,需要创建一个DocumentWriter对象,为segment命名(索引路径下的文件都是segment),然后调用DocumentWriter的addDocument()方法向索引中添加文档,最后将segment的信息保存,如果有多个segment,则判断是否需要合并,如需要则合并。
所谓segment,是指一个逻辑概念,segment是由很多Document组成的。一个索引可能有多个segment,每个segment内的索引文件都有相同的前缀。segments文件记录着当前索引有多少个segment,每个segment中有多少个Document这些信息。在多segment的索引中有很多segment,但只有一个segments文件。每个segment的所有索引文件的前缀都相同,只有后缀不同。一个典型的segment包含一下几种后缀的文件:.f,.fdt,.fdx,.fnm,.frq,.prx,.tii,.tis.segment的名称是由segment中文档数量加一转成36
(2008-09-16 22:17)
搜索技术涉及很多学科,比如:离散数学,人工智能,语言学,编译原理等等。首先来简要的说明一下搜索的原理,搜索引擎利用机器人程序,也就是搜索蜘蛛来抓取网页中的信息(比如最近淘宝屏蔽百度的方式,如下图:

搜索蜘蛛在访问一个站点前会先检查该站点的根目录是否存在robots.txt的纯文本文件,如果有的话就会根据该文件的内容来确定访问权限。如果想屏蔽哪个搜索引擎,就写入'User-agent:*
Disallow:/,只要把*换成搜索蜘蛛名就可以了'),再对这些信息进行预处理(比如切割,文本的处理等),然后用倒排的方式建立索引(大型搜索引擎都使用倒排,例如百度,google),也就是用关键词对应出现的位置的索引,搜索引擎按照用户输入的关键字在索引中查找对应出现的位置,这样大大的提高了搜多效率。
Lucene正是java领域中应用最多的
首先涉及的是数据绑定过程。Spring
MVC有这样一个特性:可以直接将表单中提交的字段自动传递到代表对象模型的java
beans。这个特性本身没有什么问题,但当你使用同一个bean来维护多个表单及数据(提交这些数据的表单是不同的)时问题就产生了。举个例子,比方说
你有一个代表用户账户的bean,而你的web应用有两个不同的表单会更新该bean,其中一个表单用来创建新帐户,另一个用来更新已有帐户,那么攻击者
就有可能“借”更新帐户的表单的“手”去修改另一个用户的帐户。第二个安全漏洞与攻击者借助用户可管理数据来控制业务流程有关。在安全领域中,人们在用户
数据的验证方面投入了很到的精力,以此来防止恶意的脚本内容或者SQL注入攻击,然而如果用户可管理数据可以被用来控制业务流程的话,那么这些数据也必须
通过验证。再举个例子,有一个使用Spring
MVC构建的交易应用,这个应用中有三个独立的控制器:一个处理新交易请求;另一个处理交易请求验证;还有一个处理交易执行。一旦该交易流程中存在某个
点,用户在这点上能操纵控制器随意将请求发送到的非既定的“视图”,那么这个业务流程就存在被扰乱的可能。如果正常交易流程被扰乱,最后执行的则会是未
(2008-07-05 10:11)
DAO已经成为持久层的标准模式,DAO使结构清晰,面向接口编程为代码提供了规范。而泛型DAO是一个类型安全的,代码精简的设计模式(相对于传统DAO),尤其在DAO组件数量庞大的时候,代码量的减少更加明显。
泛型DAO的核心是定义一个GenericDao接口,声明基本的CRUD操作:

用hibernate作为持久化解决方案的GenericHibernateDao实现类,被定义为抽象类,它提取了CRUD操作,这就是简化代码的关键,以便于更好的重用,这个就不给例子了,增删改都好写,查就需要各种条件了。
然后是各个领域对象的dao接口,这些dao接口都继承GenericDao接口,这样各个领域对象的dao接口就和传统dao接口具有一样的功能了。
下一步是实现类了,个自领域对象去实现各自的接口,
struts2整合spring2是通过插件的形式整合的,这也是struts2的一个优点,可插拔式的轻量级框架。可以讲Action的实例交ioc容器进行管理,这样有助于更好的分层解耦,当然也可以利用spring的自动装配注入action实例,但是通过修改struts.objectFactoryy.spring.atuoWrie常量改变自动装配策略有个bug,就是无法修改默认的name策略。
SSH2的整合主要流程是:控制器(action)--业务逻辑组件工厂--业务逻辑组件--DAO组件工厂--DAO组件--hibernate持久层--JDBC。
在struts.xml中配置的action指定class属性时,不是指向action的实现类,而是指向spring的bean
id,这样完成了action--bean之间的关联,由spring中对应的bean实例创建action,在action中只是调用业务逻辑组件的方法就可以。在业务逻辑方面要充分使用面向接口编程的思想,接口中定义一些业务逻辑的方法,由实现类具体实现,在业务逻辑组件中可以调用DAO组件,DAO层的设计思路与业务逻辑层基本相同,DAO层是由多个DAO组件和一个DAO工厂组成,DAO组件的实现类似于业务逻辑组件,都是面向接口编程。DAO工厂类提供一个缓冲池来缓存每个DAO实例,当然需要一个xml