Web应用整合ElasticSearch实现日志查询

前些天,boss分配了个任务给我:把ElasticSearch的日志集成到应用中,要求可以根据某个关键词key,日志保持时间段查询就可以了,ElasticSearch有api,你去网上找找看,具体选择自己把握,尽快完成。

Web应用整合ElasticSearch实现日志查询

回想了下这些年,ElasticSearch,什么鬼,没用过,遂百度之,结果发现这玩意还挺nb(具体怎么nb这里不说),首先是了解了下ELK这三兄弟,算你有一套,了解过程。。。。。。ELK这里说下K(Kibnana):一个可视化工具,用来但不限于查询ElasticSearch的数据,我们有搭建ELK这套系统,要了个账号直接就去操作了,官网学了下操作语法,下面是几个查询语句

GET _cat/indices?v // 获取所有index信息

再来一个精确查询的例子(以下ElasticSearch简称es),info(es的index) user(es的type)

POST info/user/_search

{

"query":{"term":{"name":"zhagnsan"}},

"from": 0,

"size": 100

} // 分页查询info/user下名字为zhangsan的记录

这里有几个es技术词语需要解释下,es其实与数据库比较相似,就拿mysql来比较

  • es:indexmysql:database
  • es:type mysql:table
  • es:documentmysql:数据库表一行记录
  • es:fieldmysql:数据库表中一个字段

万事具备,只欠东风,接下来该写程序来实现功能了,maven引包的实现发现有以下选择:

  • TransportClient:基于tcp的客户端
  • Jest:专门的Java客户端
  • Spring-data-elasticsearch:Spring全家桶的东西,更新速度赶不上es的更新速度
  • RestHighLevelClient/LevelHighLevelClient:官方推荐的客户端

这里我选择了RestHighLevelClient,官方推荐,遇到问题讨论的人多,问题解决快。

下面贴点干货,篇幅有限,只贴部分主要代码。

maven依赖包引入:

org.elasticsearch.client

elasticsearch-rest-high-level-client

6.2.3

springboot是个好东西,要用的,application.yml配置如下:

es:

hostAndPorts: 'ip1:9200,ip2:9200,ip3:9200,ipn:9200'

index: 'info-prod-*'

type: 'user'

es是个查询工具,把api封装成服务最好不过了,于是就有了EsClientService:

Web应用整合ElasticSearch实现日志查询

EsClientService

说明:

  • 方法getClient() 获取客户端连接;
  • 方法search() 封装es的查询,并返回SearchResponse对象;

接下来就是业务类的调用了:具体如下:

Web应用整合ElasticSearch实现日志查询

业务类调用es查询

说明:最终可以拿到搜索结果的一个Map,这个系列化返回给前端就好。

最后分享一个小坑:es的查询速度是贼快贼快的,这是基于es的分片技术,然后再合并结果使得查询结果很快,但也恰恰因为此:在深度分页(from+size > 10000)时查询速度就不再理想了,所以es干脆就直接报错了,以下为Kinbaba深度分页错误示范,望大家避免之。

Web应用整合ElasticSearch实现日志查询

es分页查询报错信息

最后,谢谢大家的观看 ^-^


分享到:


相關文章: