[ElasticSearch-5]工具-KIBANA
参考文档:
Kibana基础之直接操作ElasticSearch
ELASTICSEARCH - 工具-KIBANA
目录
Kibana简介
Kibana是一个开源的分析与可视化平台,设计出来用于和Elasticsearch一起使用的。你可以用kibana搜索、查看存放在Elasticsearch中的数据。Kibana与Elasticsearch的交互方式是各种不同的图表、表格、地图等,直观的展示数据,从而达到高级的数据分析与可视化的目的。
Elasticsearch、Logstash和Kibana这三个技术就是我们常说的ELK技术栈,可以说这三个技术的组合是大数据领域中一个很巧妙的设计。一种很典型的MVC思想,模型持久层,视图层和控制层。Logstash担任控制层的角色,负责搜集和过滤数据。Elasticsearch担任数据持久层的角色,负责储存数据。而我们这章的主题Kibana担任视图层角色,拥有各种维度的查询和分析,并使用图形化的界面展示存放在Elasticsearch中的数据。
KIBANA下载安装
下载
kibana-6.2.2-windows-x86_64.rar
启动
假设下载路径在:D:\software\kibana\kibana-6.2.2-windows-x86_64\bin
验证启动
http://localhost:5601/app/kibana#/dev_tools/console?_g=()
运行测试
在控制台里输入
GET /_cat/health?v
然后点击绿色箭头进行运行,就可以看到右侧出现查询结果
GET /_cat/health?v 这个命令用来查看服务器状态(健康度),green 表示一切OK
KIBANA索引管理
索引概念
索引相当于就是一个数据库服务器上的某个数据库,所以索引也可以看成是Elastic Search里的某个数据库
Restful 风格
接下来就要进行管理索引的工作了,管理无非就是增删改查,即 CRUD。
在使用Restful风格之前,进行所以管理需要这样的访问地址: add,delete,update,get 等不同的访问地址来表示不同的业务请求。
但是使用Restful 风格,就通过提交不同的method 来表示 CRUD:
method | 含义 |
---|---|
PUT | 表示增加 |
GET | 表示获取 |
DELETE | 表示删除 |
POST | 表示更新 |
增加索引
打开 kibana控制台运行如下命令:
PUT /blog?pretty
返回:
{
"acknowledged": true,
"shards_acknowledged": true,
"index": "blog"
}
表示创建成功了,索引名称是blog
查询
控制台输入
GET /_cat/indices?v
可以观察到新建立的索引
删除
运行如下命令:
DELETE /blog?pretty
再运行
GET /_cat/indices?v
可以观察到索引blog被删除了,右侧一个索引也看不到了
ik分词器的安装
分词器概念
分词器指的是搜索引擎如何使用关键字进行匹配,如 入门 中的关键字:护眼带光源。 如果使用like,那么%护眼带光源%,匹配出来的结果就是要么全匹配,要不都不匹配。
而使用分词器,就会把这个关键字分为 护眼,带,光源 3个关键字,这样就可以找到不同相关程度的结果了。
下载安装中文分词器
ElasticSearch 默认是没有中文分词器的,需要额外安装。
elasticsearch-analysis-ik-6.2.2.zip
下载elasticsearch-analysis-ik-6.2.2.zip,然后复制到 ElasticSearch 解压目录下D:\software\elasticsearch\elasticsearch-6.2.2
注意: elasticsearch-analysis-ik-6.2.2.zip 所存放的路径不要有空格,比如放在 program files 这样的路径下就不行了
接着运行如下命令:
D:\software\elasticsearch\elasticsearch-6.2.2\bin\elasticsearch-plugin install file:\\\\D:\software\elasticsearch\elasticsearch-6.2.2\elasticsearch-analysis-ik-6.2.2.zip
重启 ElasticSearch
安装插件后要重启,否则无法生效。
重启很简单。。。就是右上角X掉,然后重新运行elasticsearch.bat
测试中文分词效果
打开 kibana控制台运行如下命令:
GET _analyze
{
"analyzer":"ik_max_word",
"text":"我是天下无敌大帅哥"
}
返回如图所示的分词效果
KIBANA文档管理
增加文档
打开 kibana控制台运行如下命令:
新建索引
PUT /blog?pretty
增加文档
PUT /blog/tap/1?pretty
{
"name": "数据结构"
}
返回如图所示增加成功的响应
注意:其中的tap在elastic search里是type的概念,相当于数据库里的表,这里就相当于向 tap表里插入了一条数据
获取文档
输入请求:
GET /blog/tap/1?pretty
获取相应:
{
"_index": "blog", //_index 表示哪个索引
"_type": "tap", //_type 表示哪个表
"_id": "1", //_id 主键
"_version": 1, //_version 版本
"found": true, //found 数据存在
"_source": { //_source: 数据内容
"name": "数据结构"
}
}
修改文档一
修改两种方式,第一种还是用PUT,PUT本来用来做增加的,但是当输入的id已经存在的时候,就自动变成修改功能了
PUT /blog/tap/1?pretty
{
"name": "编译原理"
}
看看,此时如图所示,已经变成编译原理了,版本变更成为2了
修改文档二
修改两种方式,第二种使用 POST,这才是正规的修改,其实和修改文档1 效果一样的
POST /blog/tap/1/_update?pretty
{
"doc": { "name": "操作系统" }
}
查看
GET /blog/tap/1?pretty
留意其中的版本已经是3了,第一次创建的时候是1,第一次修改是2,现在修改是3
删除文档
执行删除:
DELETE /blog/tap/1?pretty
查看
GET /blog/tap/1?pretty
查询结果:
{
"_index": "blog",
"_type": "tap",
"_id": "1",
"found": false
}
found:false 就表示没有找到啦
批量导入
POST _bulk
{"index":{"_index":"blog","_type":"tap","_id":10001}}
{"name":"java知识基础","flog":"原创"}
{"index":{"_index":"blog","_type":"tap","_id":10002}}
{"name":"java知识基础1","flog":"原创1"}
{"index":{"_index":"blog","_type":"tap","_id":10003}}
查看所有数据
GET /blog/_search
{
"query":{
"match_all": {}
}
}
返回结果解释
took:查询花费时间,单位是毫秒
time_out:是否超时
_shards:分片信息
hits:搜索结果总览对象
total:搜索到的总条数
max_score:所有结果中文档得分的最高分
hits:搜索结果的文档对象数组,每个元素是一条搜索到的文档信息
_index:索引库
_type:文档类型
_id:文档id
_score:文档得分
_source:文档的源数据
注意:使用这种方式能够插入的上限较小
id 倒排序查询
输入命令:
GET /blog/_search
{
"query": { "match_all": {} },
"sort": [
{ "_id": "desc" }
]
}
如图所示,按照_id 倒排序
查询只返回部分字段
使用命令:
GET /blog/_search
{
"query": { "match_all": {} },
"_source": ["name"]
}
如图所示,只返回name字段
条件查询
输入命令:
GET /blog/_search
{
"query": { "match": { "name": "基础" } }
}
如图所示根据条件查询
分页查询
分页查询
从第一条数据开始,取两个,再按id倒叙排列
GET /blog/_search
{
"query": { "match_all": {} },
"from": 1,
"size": 2,
"sort": { "_id": { "order": "desc" } }
}
聚合aggregations
聚合简介
聚合可以让我们极其方便的实现对数据的统计、分析。例如:
什么品牌的手机最受欢迎?
这些手机的平均价格、最高价格、最低价格?
这些手机每月的销售情况如何?
实现这些统计功能的比数据库的sql要方便的多,而且查询速度非常快,可以实现近实时搜索效果。
基本概念
Elasticsearch中的聚合,包含多种类型,最常用的两种,一个叫桶,一个叫度量
桶(bucket)
桶的作用,是按照某种方式对数据进行分组,每一组数据在ES中称为一个桶,例如我们根据国籍对人划分,可以得到中国桶、英国桶,日本桶……或者我们按照年龄段对人进行划分:010,1020,2030,3040等。
Elasticsearch中提供的划分桶的方式有很多:
- Date Histogram Aggregation:根据日期阶梯分组,例如给定阶梯为周,会自动每周分为一组
- Histogram Aggregation:根据数值阶梯分组,与日期类似,需要知道分组的间隔(interval)
- Terms Aggregation:根据词条内容分组,词条内容完全匹配的为一组
- Range Aggregation:数值和日期的范围分组,指定开始和结束,然后按段分组
- ……
综上所述,我们发现bucket aggregations 只负责对数据进行分组,并不进行计算,因此往往bucket中往往会嵌套另一种聚合:metrics aggregations即度量
度量(metrics)
分组完成以后,我们一般会对组中的数据进行聚合运算,例如求平均值、最大、最小、求和等,这些在ES中称为度量
比较常用的一些度量聚合方式:
-
Avg Aggregation:求平均值
-
Max Aggregation:求最大值
-
Min Aggregation:求最小值
-
Percentiles Aggregation:求百分比
-
Stats Aggregation:同时返回avg、max、min、sum、count等
-
Sum Aggregation:求和
-
Top hits Aggregation:求前几
-
Value Count Aggregation:求总数
-
……
聚合为桶(统计数据)
首先,我们按照 name来划分桶,按照name分桶,最好是使用TermAggregation类型,按照bolg的名称来分桶。
运行如下命令:
第一个size:0表示 不用显示每条数据,第二个size:3表示分组数据显示3条。
GET /blog/_search
{
"size": 0,
"aggs": {
"group_by_name": {
"terms": {
"field": "name.keyword",
"size": 3
}
}
}
}
单词 | 含义 |
---|---|
size: | 查询条数,这里设置为0,因为我们不关心搜索到的数据,只关心聚合结果,提高效率 |
aggs: | 声明这是一个聚合查询,是aggregations的缩写 |
group_by_name: | 给这次聚合起一个名字,可任意指定。 |
terms: | 聚合的类型,这里选择terms,是根据词条内容(name)划分 |
field: | 划分桶时依赖的字段 |
相当于sql语句:
select count(*), name from blog group by name limit 0,3
返回结果
{
"took": 2,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 3,
"max_score": 0,
"hits": []
},
"aggregations": {
"group_by_name": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "java知识基础",
"doc_count": 1
},
{
"key": "java知识基础1",
"doc_count": 1
},
{
"key": "操作系统",
"doc_count": 1
}
]
}
}
}
单词 | 含义 |
---|---|
hits: | 查询结果为空,因为我们设置了size为0 |
aggregations: | 聚合的结果 |
group_by_name: | 我们定义的聚合名称 |
buckets: | 查找到的桶,每个不同的name字段值都会形成一个桶 |
key: | 这个桶对应的name字段的值 |
doc_count: | 这个桶中的文档数量 |