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数据,这样就能用了。

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

    结束:

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

    分类: 全文搜索
  • 相关阅读:
    /etc/sysctl.conf 控制内核相关配置文件
    python 并发编程 非阻塞IO模型
    python 并发编程 多路复用IO模型
    python 并发编程 异步IO模型
    python 并发编程 阻塞IO模型
    python 并发编程 基于gevent模块 协程池 实现并发的套接字通信
    python 并发编程 基于gevent模块实现并发的套接字通信
    python 并发编程 io模型 目录
    python 并发编程 socket 服务端 客户端 阻塞io行为
    python 并发编程 IO模型介绍
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2675955.html
Copyright © 2011-2022 走看看