前些天,boss分配了个任务给我:把ElasticSearch的日志集成到应用中,要求可以根据某个关键词key,日志保持时间段查询就可以了,ElasticSearch有api,你去网上找找看,具体选择自己把握,尽快完成。
![Web应用整合ElasticSearch实现日志查询](http://p2.ttnews.xyz/loading.gif)
回想了下这些年,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依赖包引入:
springboot是个好东西,要用的,application.yml配置如下:
es:
hostAndPorts: 'ip1:9200,ip2:9200,ip3:9200,ipn:9200'
index: 'info-prod-*'
type: 'user'
es是个查询工具,把api封装成服务最好不过了,于是就有了EsClientService:
![Web应用整合ElasticSearch实现日志查询](http://p2.ttnews.xyz/loading.gif)
EsClientService
说明:
- 方法getClient() 获取客户端连接;
- 方法search() 封装es的查询,并返回SearchResponse对象;
接下来就是业务类的调用了:具体如下:
业务类调用es查询
说明:最终可以拿到搜索结果的一个Map,这个系列化返回给前端就好。
最后分享一个小坑:es的查询速度是贼快贼快的,这是基于es的分片技术,然后再合并结果使得查询结果很快,但也恰恰因为此:在深度分页(from+size > 10000)时查询速度就不再理想了,所以es干脆就直接报错了,以下为Kinbaba深度分页错误示范,望大家避免之。
es分页查询报错信息
最后,谢谢大家的观看 ^-^
閱讀更多 Java高級開發 的文章
關鍵字: 查询 ElasticSearch MySQL