zoukankan      html  css  js  c++  java
  • 基于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数据,这样就能用了。

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

    结束:

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

    分类: 全文搜索
  • 相关阅读:
    RK3288 Android5.1系统编译
    RK3288 模块单独编译
    ubuntu 设置固定DNS
    PHP取整函数之ceil,floor,round,intval的区别
    PHP实现 APP端微信支付功能
    Laravel中服务提供者和门面模式
    laravel项目利用twemproxy部署redis集群的完整步骤
    PHP转盘抽奖算法
    laravel中短信发送验证码的实现方法
    PHP操作Redis常用
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2675955.html
Copyright © 2011-2022 走看看