最近在项目经理Jack.Wang的带领下,写了一个基于Lucene的搜索服务器,学到了很多,在此记录一下。
目的:
这是一个用Lucene建立索引并搜索的服务器,用于项目的整站搜索,对数据库或者文档的全文索引。
优点:
1、多项目使用:因为使用了restful服务,多个项目可以同时使用一个搜索服务器。
2、使用简单,灵活:只需给出一个目标项目的model层的dll文件,再根据所要建立索引的实体类配置xml;或者如果你的项目是有C#的反射特性,可以在model层的类上添加指定的特性,这样也起到了配置的作用,不在需要xml文件。这样目标项目下哪个类需要建立索引,哪个类下的哪些字段需要索引都不再是写死的了。
3、跨语言:因为使用了restful服务,最后搜索时,对外提供的是一个url,所以只需要写一个客户端发送url请求即可。没有C#反射特性,就用xml配置。
实现思路:
首先说一下建立索引端吧:
首先需要的是一个dll文件,然后通过PraseModel类,配合XML配置文件或者自身的反射特性,得到List<TypeModel>。TypeModel用于存储解析后的数据,放了这个dll文件中哪些类需要建立索引,类中的哪些字段需要建立索引,如何建立等信息。其中还需要去查一下MySql数据库,MySql数据库用于记录每次建立索引的信息。这样对比一下正要建立的类和字段,就知道本次建立索引是新建的索引呢,还是在已有索引的基础上更改,添加,删除等。
然后在对每一个TypeModel,用PraseModel类解析,解析出GenericModel。GenericModel除了记录一些建立索引的配置信息外,还要去目标项目的数据库查出具体的内容,或者是抽取出具体路劲对应文档的内容。
接下来就是把GenericModel传给Lucene,用Lucene建立索引了。因为内容大部分是中文的,所以不用他自己的分词,用盘古分词解析。
以上的每个步骤都用Log类包装的log4net记录日志。
整个建立索引的任务,由同事开发的一个任务调度来执行,安排一定的时间间隔,传入指定的参数即可。
因为lucene建立索引的时候,会把索引文件锁起来,所以我自己在建立索引的时候在外层加了锁,免得使用lucene运行时报错。
这样对于每个项目,哪些类需要建立索引,类其中的哪些字段需要建立索引,是否唯一主键,是否分词,是否存储等,都变成可配置,不用为了单一的一个项目写死。比较通用。
结束:
前文链接:搜索服务器-开篇介绍: http://www.cnblogs.com/JackWang/archive/2012/07/27/2612594.html
写得比较菜,呵呵,不够专业。先这样,下次再写Restful搜索端的实现和RestSharp搜索客户端的使用。
下文:http://www.cnblogs.com/Norman-ZL/archive/2012/09/07/2674826.html