此篇博客是我的第一篇技术性博客,用于回顾和总结最近本人关于Elasticsearch的调研成果和使用经验。其内容更偏向于实践,理论知识较少。若有不足之处,欢迎指正。
elastic: [ɪˈlæstɪk],可伸缩的、灵活的;search:搜索,顾名思义,这是一个十分灵活的用于搜索的工具,它本身具有存储数据的功能。最近一个月使用下来,发现它的搜索和数据处理功能(聚合)非常强大。数据的增删查改均是通过RESTful API来实现的,所以通用性很强,几乎所有开发语言都可以实现它的调用。
一、如何在linux平台上安装?
1、准备工具:jdk1.8安装包、Elasticsearch6.2.3安装包、Kibana安装包(Elasticsearch网页版工具);
2、安装jdk(自行百度)
3、将Elasticsearch安装包解压到公共目录下,比如/data/es
4、由于Elasticsearch禁止使用root用户启动,所以需要新建一个普通用户esuser,并为这个用户赋予相关目录的权限(777)
5、为了将Elasticsearch暴露出来供其他计算机远程访问,需要修改配置文件
①vim ./bin/config/elasticsearch.yml,如图:
②vim ./bin/config/jvm.options,如图:
③vim /etc/sysctl.conf,如图:
然后:sysctl -p
④vim /etc/security/limits.conf
6、一定要退出终端,重新用esuser用户登录,然后再启动: ./bin/elasticsearch
7、安装Kibana
①解压安装包,下载地址:https://www.elastic.co/downloads/kibana
②修改配置文件:vim ./config/kibana.yml,如图:
③启动:nohup bin/kibana &
④打开地址:http://{host}:5601
二、如何在Kibana上使用Elasticsearch?
1、使用界面如下,Dev Tools即是我们的调试工具
2、新建一张表,在你第一次向Elasticsearch推送数据的时候,它会自动生成索引(_index,相当于数据库name)和类型(_type相当于表name),请求信息如下:
3、查询数据:GET /servicequality/doc/36,结果如下:
4、更新数据,同第2步,改变对应属性的值即可
5、删除数据:DELETE /servicequality/doc/36
6、查询各个属性的类型:GET /servicequality/doc/_mapping(一但创建了数据,则不能更改该_index该_type下属性的类型)
7、重中之重,复杂查询与聚合
如下图,我是想查出namespace=“oneNet.service.HTTP-PUSH.mqtt-to-http.push”,metric=“time-delay”,region=“BEIJING”,timeStamp大于1525851600且小于1525938000的数据,然后将查询到的数据进行聚合。聚合逻辑是:以timeStamp属性进行分段统计,每隔720为一段,对每一段的数据求两次和,一次是满足skey=“count”的数据求value字段的和,一次是满足skey=“accumulator”的数据求value字段的和(前者是业务中的概念——数量,后者是业务中的概念——累计总和),这样我就可以通过两者的值求出平均值。
但除此之外,细心的你可能已经发现请求体里还包含了其他关键字,这些参数都是我们踩过的坑啊!
size=0,指定返回源数据的个数,默认是10,0则代表不放源数据,只返回聚合后的结果。
nameSpace.keyword,如果不添加keyword,则Elasticsearch将会将“oneNet.service.HTTP-PUSH.mqtt-to-http.push”进行拆词分析,可能会查询出等于“oneNet.service.HTTP-PUSH.edp-to-http.push”的结果,加上了keyword则不会进行分析,而是完全匹配。
aggs,aggregation=聚合。使用结构"aggs":{ "agg_A":{...可以添加子聚合"aggs"}, "agg_B":{...} }
histogram:直方图。这是Elasticsearch的其中一种聚合方式(可以理解为分段聚合),除此之外,还有针对date格式的date_histogram聚合
offset:偏移量,补偿。Elasticsearch默认是从0开始分段的,不加offset,则分段为:[0,720) [720,1440) [2160,2880)......[1525851360,1525852180)......,但我希望我们的起始点1525851600恰好是新的一段的开始,所以添上偏移量240(1525851600取模720等于240),这样分段为:[240,960) [1680,2400).....[1525851600,1525852320)...
extended_bounds:延伸的界限。如果不加extended_bounds,当查询范围内没有数据的时候,它不会返回聚合结果,加上之后,它会强制性返回该范围内的聚合结果,如果没有数据,则为0。
sum:求和。除此之外,还有avg求平均值等等,大约共十种计算方式。
三、在java中的使用
1、使用环境:java8、spring boot 2.0.0、maven3.5.2
2、maven dependency:
3、配置Elasticsearch TransportClient
4、将Kibana中的请求体转换为java代码:
5、执行查询,解析结果,获得每一段的两个和,然后相除,得到平均值。
附注:
参考资料:
Elasticsearch官方中文文档
format about date官方英文文档
aggregations官方英文文档
histogram aggregation and offset官方英文文档