基于LUCENE的搜索服务器

最近在项目经理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

 

上文: 基于lucene的搜索服务器 写的是创建索引端。

今天写一下搜索端的实现思路。

Restful Service的搜索服务:

搜索服务接受URL请求,通过Config解析一下url中的参数,得到有用的参数。如(关键字,搜索目标项目名,项目dll名,索引文件夹路径,xml配置文件路径,搜索关系,等等。)

再通过PraseDLL类和PraseModel类,结合具体的DLL文件和XML配置文件,解析出更具体的搜索条件(如哪个字段是哪个关键字,各个字段搜索时是或还是且等逻辑信息)。用QueryPrase得到Lucene的搜索条件Query,传给Lucene,搜出符合条件的具体结果集。

因为搜索时,需求可能并不是对一个类的索引文件进行搜索,可能是搜索多个类的索引文件,然后让结果混在一起,按照Lucene的评分排序,所以最后输出的结果是一个List<object>。实体类属性中如果有评分属性,则保存了Lucene的打分情况(哪个属性是评分属性,哪个是搜索字段属性,这些都是XML配置的或者是C#特性),然后用HighLight对其中搜出的内容加入关键字高亮,都根据配置来决定是怎么个高亮法,显示摘要多少字。

最后再把List<object>装换成一个Json格式的String输出。

消费服务的项目客户端:(用RestSharp消费RestFul服务)

这个貌似也没啥可写的。。。

我是用RestSharp写的,构造需要的url,然后get请求,得到结果(json格式的string类型)后,再在前台把结果转换成Json数据,这样就能用了。

各个项目可以有自己的实现。

结束:

呵呵,只是记录当时开发这个的思路,以后可以温故而知新,看看现在的自己写的代码,思路有啥不足,也高兴下自己的成长。

分类: 全文搜索
原文地址:https://www.cnblogs.com/Leo_wl/p/2675955.html