搜索与分析引擎——Elasticsearch之初探与实践

此篇博客是我的第一篇技术性博客,用于回顾和总结最近本人关于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,如图:

搜索与分析引擎——Elasticsearch之初探与实践_第1张图片
修改为自己的host

②vim ./bin/config/jvm.options,如图:

搜索与分析引擎——Elasticsearch之初探与实践_第2张图片

③vim /etc/sysctl.conf,如图:

然后:sysctl -p

④vim /etc/security/limits.conf

搜索与分析引擎——Elasticsearch之初探与实践_第3张图片

6、一定要退出终端,重新用esuser用户登录,然后再启动: ./bin/elasticsearch

7、安装Kibana

①解压安装包,下载地址:https://www.elastic.co/downloads/kibana

②修改配置文件:vim ./config/kibana.yml,如图:

搜索与分析引擎——Elasticsearch之初探与实践_第4张图片
修改为自己的host

③启动:nohup bin/kibana &

④打开地址:http://{host}:5601

二、如何在Kibana上使用Elasticsearch?

1、使用界面如下,Dev Tools即是我们的调试工具

搜索与分析引擎——Elasticsearch之初探与实践_第5张图片
中间为请求路径与参数,Kibana可以自动补全,自动保存请求信息,右边为请求的返回结果

2、新建一张表,在你第一次向Elasticsearch推送数据的时候,它会自动生成索引(_index,相当于数据库name)和类型(_type相当于表name),请求信息如下:

搜索与分析引擎——Elasticsearch之初探与实践_第6张图片
它会自动创建_index=servicequality,_type=doc,_id=36的一条数据,如果不指定_id,Elasticsearch将自动生成。其中各个属性的值就是请求参数,该“表”的各个属性的类型也因此确定下来,不能更改了!

3、查询数据:GET /servicequality/doc/36,结果如下:

搜索与分析引擎——Elasticsearch之初探与实践_第7张图片
_source 代表源数据

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求平均值等等,大约共十种计算方式。

搜索与分析引擎——Elasticsearch之初探与实践_第8张图片
复杂查询的请求体
搜索与分析引擎——Elasticsearch之初探与实践_第9张图片
查询结果

三、在java中的使用

1、使用环境:java8、spring boot 2.0.0、maven3.5.2

2、maven dependency:

搜索与分析引擎——Elasticsearch之初探与实践_第10张图片
搜索与分析引擎——Elasticsearch之初探与实践_第11张图片

3、配置Elasticsearch TransportClient

搜索与分析引擎——Elasticsearch之初探与实践_第12张图片

4、将Kibana中的请求体转换为java代码:

搜索与分析引擎——Elasticsearch之初探与实践_第13张图片

5、执行查询,解析结果,获得每一段的两个和,然后相除,得到平均值。

搜索与分析引擎——Elasticsearch之初探与实践_第14张图片
执行查询,解析结果
搜索与分析引擎——Elasticsearch之初探与实践_第15张图片
需要注意紫色横线部分,右侧都是getAggregations().get("xxx"),但左侧分别是Filter和Sum,这是两种聚合对象,必须根据自己请求体的聚合类型来,不然会解析失败。

附注:

参考资料:

Elasticsearch官方中文文档

format about date官方英文文档

aggregations官方英文文档

histogram aggregation and offset官方英文文档

你可能感兴趣的:(搜索与分析引擎——Elasticsearch之初探与实践)