java实现solr全文检索_使用Solr进行服务日志全文检索(1.29)

这个是我们年初就规划准备做的一个关键功能,即原来的服务日志检索更多的是根据服务运行日志,服务调用时间段进行日志检索,而不能根据业务报文里面的内容进行检索。由于我们在存储日志的时候,业务处理的消息报文是作为Blob类型结构化存储到数据库里面的,因此在传统模式下要实现报文的全文检索并不容易。而Solr是当前特别是互联网和电商使用的比较多的一个全文检索引擎,包括一些电商网站的商品模糊查询功能也在使用Solr进行模糊查询,应用相对广泛。

我们先看下Solr的基本介绍:

Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器。Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化。

Solr可以独立运行,运行在Jetty、Tomcat等这些Servlet容器中,Solr 索引的实现方法很简单,用 POST 方法向 Solr 服务器发送一个描述 Field 及其内容的 XML 文档,Solr根据xml文档添加、删除、更新索引 。Solr 搜索只需要发送 HTTP GET 请求,然后对 Solr 返回Xml、json等格式的查询结果进行解析,组织页面布局。Solr不提供构建UI的功能,Solr提供了一个管理界面,通过管理界面可以查询Solr的配置和运行情况。

对于Solr和Lucence的区别,我们参考知乎的一个答案:

地址:https://www.zhihu.com/question/19639211/answer/13891457

Lucene更像是一个SDK。 有完整的API族以及对应的实现。你可以利用这些在自己的应用里实现高级查询(基于倒排索引技术的),Lucene对单机或者桌面应用很实用很方便。但是Lucene,需要开发者自己维护索引文件,在多机环境中备份同步索引文件很是麻烦。

Solr是一个有HTTP接口的基于Lucene的查询服务器,封装了很多Lucene细节,自己的应用可以直接利用诸如 .../solr?q=abc 这样的HTTP GET/POST请求去查询,维护修改索引。

给个比方就是,Lucene是给你一堆包,让你自己从底层构建一个数据库。而Solr是一个实现好的数据库程序,安装后就可以直接用了。

对于ESB服务运行日志采用Solr进行全文检索的一些思考:

注意Solr的底层数据库本身就是一种key-value结构的非结构化数据,而对于value值一般又是以Xml结构进行存储,这种结构天然的适合对服务运行日志信息进行存储和查询。对于服务运行,每一次运行ESB都会生成一个独立的UUID值,而这个值就是存储的Key值,同时对于服务运行生成的输入和输出则形成一个大的XML消息文本放入Document对象里面即可。同时可以看到日志信息本身不需要改写,而是只读性质。

对于Solr库本身提供Http Rest接口间索引的创建,包括查询功能,因此后续使用也相当简单。

首先我们看下如何通过Solr进行服务日志的实时查询能力,在原来我们的方案里面是对于服务调用日志信息会先送入到JMS消息管道里面,然后异步的方式通过Java程序读取到后送入到DB数据库中。那么现在就有两种方法来做,即将日志信息写入到两个JMS队列,或一个消息Topic中,即日志消息同时分发到DB数据库和Solr库中,这样就可以保证Solr库中的索引和文本数据始终都是实时和最新的。

对于Solr的查询,本身也天然的支撑xml结构,特别是根据关键字段的关键字查询能力。比如对于如下的一个xml结构的Document对象。

20180129221558_775.jpg

我们来看,常见的一些查询能力。

根据一个element关键字段来进行关键值的查询

http://localhost:8001/solr/select?q=name:"A Clash of Kings"

使用通配符查询

http://localhost:8001/solr/select?q=name:"*Kings*"

根据时间段进行模糊查询

http://localhost:8001/solr/select?q=date:[201507 TO 201510] and name:"*Kings"

而这正是服务日志根据业务关键字查询的关键业务场景需求,比如我们可以根据采购订单号来查询服务日志,可以根据采购订单名称来查询服务日志等。也可以根据名称和时间段来组合模糊查询。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值