[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: 这个桶中的文档数量
全部评论

相关推荐

斑驳不同:还为啥暴躁 假的不骂你骂谁啊
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务