【Elasticsearch】3. Elasticsearch基础检索

326 阅读7分钟

Kibana介绍

Kibana 是一个设计出来用于和 Elasticsearch 一起使用的开源的分析与可视化平台,可以用 kibana 搜索、查看、交互存放在Elasticsearch 索引里的数据,使用各种不同的图表、表格、地图等展示高级数据分析与可视化,基于浏览器的接口使你能快速创建和分享实时展现Elasticsearch查询变化的动态仪表盘,让大量数据变得简单,容易理解。

通俗来说,Kibana是客户端,ES就是服务器,所以在使用Kibana时,需要全程保证ES服务的开启。

Kibana安装

  1. 环境准备:JDK8,Elasticsearch 6.8

  2. 下载地址:www.elastic.co/cn/download…

    20210810175325.png

    20210810175116.png

    注意:Kibana的版本必须和ES的版本严格对应。

  3. 解压zip包

  4. 如果Kibana和ES不在一台服务器,需要另行配置ES的服务器地址,Kibana默认ES服务器地址为localhost,详细百度。

  5. 启动Kibana:先启动ES,进入Kinbana的bin目录

    kibana.bat
    
  6. 浏览器访问,如果显示该界面,说明启动成功。

    http://localhost:5601
    

    20210810181609.png

    Kibana端口为5601。

    Kibana与ES通信,使用的是ES的9200端口。

Kibana Dev Tools使用

1. 界面介绍

20210810182348.png

2. Index相关操作

创建Index

PUT /索引名

注意:

  • 因为ES完全遵循了RESTFul,所以操作ES的命令也都遵循REST格式。

  • 如果索引名中有大写字母,则创建失败。可以包含小写字母和数字,但是不建议包含数字。

  • 在创建Index时,会有如下提示:

    20210810182847.png

    表示,在6.x之前创建一个Index,ES默认会创建对应的5个分片(shards),这个Index的全部数据将被分给5个分片独立存储,这5个分片一般会存储在不同的节点上,以防某一个分片的节点出现故障导致Index的数据不会全部丢失。在7.x之后,ES默认只会创建1个分片来全部存储该Index的全部数据,如果要调整存储的分片个数需要另行设置。

  • 一般不单独创建Index,而是和Type,Mapping一起创建。

查看全部Index

GET /_cat/indices

查看成功后,Index列表会有如下两个Index,这两个Index是Kibana6.8自带的Index,无需关注,但是不能删除。

20210810184345.png

其实该命令ES响应的是一个表格,如果想看的更直观,使用如下命令:

GET /_cat/indices?v

该命令ES将原本的响应信息增加了表头,从而知道了每列数据的含义。

20210810184958.png

  • health:Index的健康状况,green表示Index健康,yellow表示Index不健康,red表示Index不可用。
  • status:Index的状态,默认是open,如果是close,则Index不能被操作。
  • uuid:Index的唯一标识。
  • pri:Index的默认主分片数。
  • rep:Index的副本分片数。
  • docs.count:Index的文档数。
  • docs.deleted:Index中被删除的文档数。
  • store.size:Index的存储大小。
  • pri.store.size:Index主分片的存储大小

查看指定Index

GET /索引名

能查看的信息包括:

  • Index中所有Type。
  • Index中的配置信息。

删除指定index

DELETE /索引名

删除全部index

DELETE /*

注意:这样操作会将两个Kibana默认创建的两个Index删除,导致Kibana不可用。如果意外删除,重启Kibana即可。

3. Type相关操作

常用字段类型

  • keyword:短文本类型

  • text:长文本类型

  • date:日期类型

  • integer,long:整数类型

  • float,double:浮点类型

  • boolean:逻辑类型

  • ip:IP类型

创建Type

创建Type时,Mapping也同时创建。类似于建Table时,Schema需要同时定义。

PUT /postilhub
{
  "mappings": {
    "user": {
      "properties": {
        "id": { "type": "keyword" },
        "username": { "type": "keyword" },
        "password": { "type": "keyword" },
        "age": { "type": "integer" },
        "sex": { "type": "boolean" },
        "birth": { "type": "date" }
      }
    }
  }
}

上面指令的含义为:创建一个名为postilhub的Index,同时在该Index内创建一个名为user的Type,同时给Type定义Mapping(id—keyword,username—keyword,password—keyword,age—integer,sex—boolean,birth—date)。

查看Type

GET /索引名/_mapping

如果该Index中有多个Type,那么就会返回全部Type。但是一般情况下一个Index中只有一个Type,所以该命令可以查看指定的某一个Type信息。

4. Document相关操作

新增Document

PUT /postilhub/user/1
{
  "id": "1",
  "username": "john",
  "password": "123",
  "age": 18,
  "sex": true,
  "birth": "2021-08-11"
}

上面指令的含义为:在名为postilhub的Index下,名为user的Type下,创建一个_id为1的Document。该Document的数据为:id="1",username="john",password="123",age=18,sex=true,birth="2021-08-11"。

在Document存储到ES过程中,ES都会给该Document设置一个 _id,_id 的值推荐从创建Document的命令中获取,如果创建命令中没有指定 _id 的值,如下,那么ES会自动生成一个值赋给 _id,并把 _id 的值返回。一般情况下,我们会把该Document中我们定义的 id 字段的值和ES中 _id 的值保持一致。

POST /postilhub/user
{
  "id": "1",
  "username": "john",
  "password": "123",
  "age": 18,
  "sex": true,
  "birth": "2021-08-11"
}

20210811020002.png

查询指定Document

GET /索引名/类型名/文档的_id

删除指定Document

DELETE /索引名/类型名/文档的_id

更新指定Document (不保留原始数据)

POST /postilhub/user/1
{
  "age": 20
}

上面指令的含义为:在名为postilhub的Index下,名为user的Type下,先删除 _id 为1的Document,再创建 _id 为1的Document,数据为:age=20。

更新指定Document (保留原始数据)

POST /postilhub/user/1/_update
{
  "doc": {
    "age": 20
  }
}

上面指令的含义为:在名为postilhub的Index下,名为user的Type下,先将_id为1的Document查询出来,再将doc中设置的字段值替换Document中相同字段的值,将Document中age字段的值改为20,其他字段数据保持不变。

在更新时,还可以添加原本未设置的字段,如下命令,此时名为user的Type下,Mapping中自动添加了一个名为dept的字段,该字段的类型由ES通过赋的值自动匹配合适的类型并设置,因此可能新字段的类型并不符合你的预期。

POST /postilhub/user/1/_update
{
  "doc": {
    "age": 20,
    "dept": "develop"
  }
}

批量插入Document

批量插入Document,使用到的是 _bulk 和 index API。

PUT /postilhub/user/_bulk
{ "index": { "_id": "2" } }
  { "id": "2", "username": "andy", "password": "123", "age": 21, "sex": false, "birth": "2000-09-01" }
{ "index": { "_id": "3" } }
  { "id": "3", "username": "pony", "password": "123", "age": 37, "sex": true, "birth": "1982-12-11" }

上面指令的含义为:在名为postilhub的Index下,名为user的Type下,批量操作Document。操作的内容为:添加一个 _id 为2的Document和一个 _id 为3的Document。

如果批量插入Document时不指定 _id 的值,则ES会自动为其赋值并返回。

PUT /postilhub/user/_bulk
{ "index": {} }
  { "id": "2", "username": "andy", "password": "123", "age": 21, "sex": false, "birth": "2000-09-01" }
{ "index": {} }
  { "id": "3", "username": "pony", "password": "123", "age": 37, "sex": true, "birth": "1982-12-11" }

批量删除Document

批量删除Document,使用到的是 _bulk 和 delete API。

PUT /postilhub/user/_bulk
{ "delete": { "_id": "2" } }
{ "delete": { "_id": "3" } }

上面指令的含义为:在名为postilhub的Index下,名为user的Type下,批量操作Document。操作的内容为:删除 _id 为2和 _id 为3的Document。

批量更新Document

批量更新Document,使用到的是 _bulk 和 update API。

PUT /postilhub/user/_bulk
{ "update": { "_id": "2" } }
  { "doc": { "age": 22, "sex": true } }
{ "update": { "_id": "3" } }
  { "doc": { "age": 38, "sex": false } }

上面指令的含义为:在名为postilhub的Index下,名为user的Type下,批量操作Document。操作的内容为:更新 _id 为2和 _id 为3的Document中的age和sex字段数据。

批量混合操作(插入+删除+更新)

PUT /postilhub/user/_bulk
{ "index": { "_id": "3" } }
  { "id": "3", "username": "pony", "password": "123", "age": 37, "sex": true, "birth": "1982-12-11" }
{ "delete": { "_id": "3" } }  
{ "update": { "_id": "2" } }
  { "doc": { "age": 22, "sex": true } }

注意:批量操作不是原子操作,假如在上述命令中,插入操作失败,也不会影响删除和更新操作的执行。因为ES主要提供的是快速搜索查询服务,所以相对弱化了事务的概念。