Kibana进行ES操作

发布于 2022-09-05  6.63k 次阅读


    Kibana是一个针对Elasticsearch的开源分析的可视化平台,使用Kibana可以查询、查看并于存储在ES索引的数据进行交互操作,使用Kibana能执行高级的数据分析、并能以图表、表格和地图的形式查看数据

Kibana是由Elastic Stack官方提供,它有比普通HTTP请求的方式进行操作更简便

ES默认支持RestFul,可以提供普通的http请求就可以进行操作,使用PostMan和APIPost都可以做为操作客户端,Kibana相比较更好用,配套功能更强

1. Linux安装Kibana

下载地址:https://www.elastic.co/cn/downloads/past-releases#kibana

① 解压Kibana

tar -zxvf kibana-7.14.2-linux-x86_64.tar.gz

② 编辑Kibana配置文件

vim /etc/kibana/kibana.yml
# 添加如下内容
# 开启Kibana的远程访问
server.host: "0.0.0.0"
# 配置ES的服务器地址
elasticsearch.hosts: ["http://localhost:9200"]

③ 兴建用户,并赋予Kibana权限

# 新建用户
useradd estest
# 设置用户密码
passwd estest
# 赋予estest用户操作kibana的文件权限
chown -R estest:estest ./kibana-7.14.2-linux-x86_64/

④ 启动kibana

./bin/kibana

⑤ 访问Kibana的web界面(端口5601)

2. Kibana操作ES

2.1 索引的基本操作

2.1.1 创建索引

格式:

PUT /索引名称

注:

  1. ES中索引健康状态,(red)索引不可用、yellow(索引可用,存在风险)、green(健康)
  2. 默认ES在创建时会为索引创建一个备份索引和一个primary索引

创建索引,进行索引分片配置

PUT /索引名称
{
    "settings":{
        "number_of_shards":1, #指定主分片的数量
        "number_of_replicas":0 #指定副本分片的数量
    }
}

2.1.2 查询索引

1,查询单个索引

GET /索引名称/id

2,查询全部索引

GET _cat/indices?v

例:查询全部索引

health status index                           uuid                   pri rep docs.count docs.deleted store.size pri.store.size
green  open   .apm-custom-link                xAsvjOUKQ-eu9svfRRr7cA   1   0          0            0       208b           208b
green  open   .apm-agent-configuration        268nkfGXQuyA_6MbsVW2tA   1   0          0            0       208b           208b
green  open   索引名称                            lUlpnVEQTFu7QxRVqpA-4Q   1   0          0            0       208b           208b
green  open   .kibana_task_manager_7.14.2_001 cr-FhHrCS9SLhAciXNPX1g   1   0         14          957      1.6mb          1.6mb
green  open   .kibana_7.14.2_001              kMXQbj85S1mq8RHGyaf8tw   1   0         50           16      4.7mb          4.7mb
green  open   kxj                             NTwdDaKyQCSkhBgUkKKqAg   1   0          0            0       208b           208b
green  open   .tasks                          VDAoW0uuTWyjMnOYeOp6EA   1   0          4            0     21.4kb         21.4kb
green  open   .kibana-event-log-7.14.2-000001 6XBKme7bSYeFi9x1lo5CMw   1   0          3            0     16.4kb         16.4kb
  • health:健康状态(green->健康 yellow->存在风险但可用 red->不可用)
  • status:当前索引的开启状态,默认open为开启
  • index:索引的名称
  • uuid:索引的id唯一标识,uuid自动生成
  • pri:索引的主分片数量
  • rep:索引的副本数量
  • docs.count:索引下的doc的数量
  • docs.deleted:索引下删除doc的数量
  • store.size:占用的大小
  • pri.store.size:主分片占用的大小

注:索引名称已.开头的是系统索引或临时索引

删除索引

格式:

DELETE /索引名称

2.2 映射的基本操作

同时创建索引和映射

PUT /索引名称
"mappings":{
    "properties":{
            "字段":{
                type:""    
        }
           …………
    }
}
  • mappings:表示创建映射
  • properties:映射具体字段
  • type:字段类型

ES提供的映射类型:

  1. 字符串类型:keyword(禁止分词)、text
  2. 数字类型:integer,long
  3. 小数类型:float,double
  4. 布尔类型:boolean
  5. 日期类型:date

映射决定了文档的内容格式

例:创建一个products索引,添加title、price,create_at三个字段的映射

PUT /products
{
  "mappings": {
    "properties": {
      "title":{
        "type":"text"
      },
      "price":{
        "type": "double"
      },
      "create_at":{
        "type":"date"
      }
    }
  }
}

创建成功后查看products的映射信息:GET /products/_mappings

{
  "products" : {
    "mappings" : {
      "properties" : {
        "create_at" : {
          "type" : "date"
        },
        "price" : {
          "type" : "double"
        },
        "title" : {
          "type" : "text"
        }
      }
    }
  }
}

注:映射信息是不允许删除和修改的,想要删除只能删除索引,修改只能重新创建索引重新配置映射

2.3 文档的基本操作

2.3.1 添加文档

添加文档两种方式:

# 指定文档id创建
POST /索引名称/_doc/文档id
{
文档内容
    }

#使用自动生成id创建文档
POST /索引名称/_doc
{
文档内容
    }

例:为products索引创建文档

POST /products/_doc/1000
{
  "title":"英雄联盟手机壳",
  "price":20,
  "create_at":"2022-09-01"
}

响应:

{
  "_index" : "products", //索引名称
  "_type" : "_doc", //文档
  "_id" : "1000", //id
  "_version" : 1, 
  "result" : "created",
  "_shards" : {
    "total" : 2, 
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 0,
  "_primary_term" : 1
}

2.3.2 查询文档

查询单个文档:按照id查询

GET /索引/_doc/文档id

查询全部文档:

GET /products/_doc/_search

例:获取id为1000的文档

{
  "_index" : "products",
  "_type" : "_doc",
  "_id" : "1000",
  "_version" : 1,
  "_seq_no" : 0,
  "_primary_term" : 1,
  "found" : true,
  "_source" : {
    "title" : "英雄联盟手机壳",
    "price" : 20,
    "create_at" : "2022-09-01"
  }
}

2.3.3 删除文档

删除文档:按照id删除

DELETE/索引/_doc/文档id

例:删除id为1000的文档

DELETE /products/_doc/1000

2.3.4 更新文档

方式1:覆盖式更新

PUT /索引/_doc/文档id
{
  内容
    }

注:这种更新方式是先删除原始文档,在将更新文档以新的内容插入

方式2:局部更新

POST/索引/_doc/文档id/_update
{
    "doc":{
        内容
        }
    }

注:这种方式可以将数据原始内容保存,并在此基础上更新

例:局部更新id为1000的文档

POST /products/_doc/1000/_update
{
  "doc":{
  "title":"拯救者"
  }
}

2.4 文档的批量操作

1,批量添加文档

POST /索引/_doc/_bulk
{"index":{"_id": 自定义}}
{内容}
"index":{"_id": 自定义}}
{内容}
…………

注:内容必须在一行,不然会报错

例:为索引products批量添加数据

POST /products/_doc/_bulk
{"index":{"_id":1}}
  {"title":"华硕-飞行堡垒","price":6999.99,"create_at":"2022-09-01"}
{"index":{"_id":2}}
  {"title":"惠普-暗夜精灵","price":5999.99,"create_at":"2022-09-01"}

2,批量更新文档

POST /索引/_doc/_bulk
{"update":{"_id": 自定义}}
{"doc":{内容}}
"update":{"_id": 自定义}}
{"doc":{内容}}
…………

例:批量更新id为1和2文档

POST /products/_doc/_bulk
{"update":{"_id":1}}
  {"doc":{"title":"雷神911","price":6999.99,"create_at":"2022-09-01"}}
{"update":{"_id":2}}
  {"doc":{"title":"宏基-暗影骑士","price":5999.99,"create_at":"2022-09-01"}}

3,批量删除

POST /products/_doc/_bulk
{"delete":{"_id":文档id}}

注:批量时不会因为一个失败而全部失败,而是继续执行后续操作,在返回时按照执行的状态返回

2.5 Query DSL查询

    ES提供了一种强大的检索数据方式,这种检索方式称之为Query DSL<Domain Specified Language>,Query DSL是利用Rest API传递JSON格式的请求体(Request Body)数据与ES进行交互,这种方式的丰富查询语法让ES检索变得更方便

① 查询所有文档

match_all关键字:返回索引中的全部文档

GET /索引/_search
{
    "query":{
        "match_all":{}
    }
}

例:

GET /products/_search
{
  "query":{
    "match_all":{}
  }
}

② 关键字查询

term关键字:用来使用关键词查询

GET /索引/_search
{
    "query":{
        "term":{
            "字段":{
                "value":"关键词或者值"
            }
        }
    }
}
  • keyword、integer、double、date类型:不进行分词全部内容查询
  • text类型:默认es标准分词器,中文单字分词,英文单词分词

注:

  • 除了text类型以外,其他类型均不做分词
  • text使用默认分词器,中文只能单字查询一个词语则搜索不到,英文则单词查询句子也查询不到

例:

GET /products/_search
{
  "query": {
    "term": {
      "title": {
        "value": "雷"
      }
    }
  }
}

③ 范围查询

range关键字:用来指定查询指定范围内的文档

GET /索引/_search
{
    "query":{
        "range":{
            字段{
                "判断关键字":值
            }
        }
    }
}

判断关键字:"gt" 大于,"lt"小于,"le"小于等于,"eq"等于,"ne"不等于,"ge"大于等于

例:

GET /products/_search
{
  "query":{
    "range":{
      "price":{
        "lt": 6000
      }
    }
  }
}

④ 前缀查询

prefix关键字:用来检索含有指定前缀的关键词的相关文档

GET /索引/_search
{
    "query":{
        "prefix":{
            "字段":{
                "value":值
            }
        }
    }
}

例:

GET /products/_search
{
    "query":{
        "prefix":{
            "title":{
                "value":"宏"
            }
        }
    }
}

⑤ 通配符查询

wildcard关键字:

  • ?:匹配一个任意字符
  • *:匹配多个任意字符
GET /索引/_search
{
    "query":{
        "wildcard":{
            "字段":{
                "value":"值+通配符"
            }
        }
    }
}

例:

GET /products/_search
{
    "query":{
        "wildcard":{
            "title":{
                "value":"灵"
            }
        }
    }
}

⑥ 多id查询

ids关键字:值为数组类型,用来依据一组id获取多个对应文档

GET /索引/_search
{
    "query":{
        "ids":{
             "values":[id列表]
        }
    }
}

例:

GET /products/_search
{
    "query":{
        "ids":{
            "values": ["1","2","1000"]
        }
    }
}

⑦ 模糊查询

fuzzy关键字:用来模糊查询含有指定关键字的文档

GET /索引/_search
{
    "query":{
        "fuzzy":{
             "字段":"值"
        }
    }
}

注:fuzzy模糊查询,最大模糊错误必须在0-2之间

  • 搜索关键词长度为2不允许存在模糊
  • 搜索关键词长度为3-5允许存在一次模糊
  • 搜索关键词长度大于5允许存在最大两次模糊

⑧ 布尔查询

bool关键字:用来组合多个条件实习复杂查询

  1. must:相当于&&同时成立
  2. should:相当于||至少成立一个
  3. must_not:相当于!不能满足任何一个
GET /索引/_search
{
    "query":{
        "bool":{
             "must":[
                其他条件查询
            ]
        }
    }
}

例:

GET /products/_search
{
    "query":{
        "bool": {
          "must": [
            {
              "term": {
                "title": {
                  "value": "雷"
                }
              }
            }
          ]
        }
    }
}

⑨ 多字段查询

multi_match关键字:同时对多个字段进行匹配查询

GET /索引/_search
{
    "query":{
        "multi_match":{
             "query":"匹配值",
             "fields":["字段A","字段B"……]
        }
    }
}

注:字段类型分词,将查询条件分词之后进行查询该字段,如果该字段不分词就会将查询条件作为整体进行查询

例:

GET /products/_search
{
  "query": {
    "multi_match": {
      "query": "影",
      "fields": ["title","price"]
    }
  }
}

⑩ 高亮查询

highlight关键字:可以让符号条件的文档中的关键词高亮

GET /索引/_search
{
  "query": {
       查询语句
  }
  "highlight":{
        "fields":{
            "高亮的字段名":{}
        }
    }
}

注:

  • 在ES7中只有支持分词的字段才能高亮
  • *{} :代表所有字段都高亮

自定义高亮的HTML标签:

  • pre_tage:关键词前面的标签
  • post_tags:关键词后面的标签

例:

GET /products/_search
{
  "query": {
    "term": {
      "title": {
        "value": "雷"
      }
    }
  },
  "highlight": {
    "fields": {
      "*":{}
    },
    "pre_tags": ["<span style='color:red;'>"],
    "post_tags": ["</span>"]
  }
}

⑾ 分页查询

  • size关键字:指定查询结果中返回指定条数,默认返回值10条
  • from关键字:指定起始返回位置,和size关键字连实现分页(起始位置为0)
GET /索引/_search
{
    "query":{
        "查询语句"
    },
    "size":"条数",
    "from":"起始位置"
}

例:

GET /products/_search
{
  "query":{
    "match_all":{}
  },
  "size": 3,
  "from": 0
}

(12) 排序查询

  • sort:声明排序
  • order:指定排序方式,倒序desc,正序asc
GET /索引/_search
{
    "query":{
        "查询语句"
    },
        "sort":[
            "排序字段":{
                "order":"desc | asc"
                }
            ]
}

例:

GET /products/_search
{
  "query":{
    "match_all":{}
  },
  "sort": [
    {
      "price": {
        "order": "asc"
      }
    }
  ]
}

2.5 Filter Query过滤查询

ES中的查询操作主要有两种:

  • 查询(query DSL)
  • 过滤(filter)

    查询即是之前使用的query DSL查询,它默认会计算每个返回文档的得分,然后根据得分排序。而过滤(filter)只会筛选出符号的文档,并不计算得分,而且它可以缓存文档。所以单从性能考虑,过滤比查询更快

 过滤适合于在大范围筛选数据,而查询适合于精确匹配数据。一般应用时,应当使用过滤操作过滤过程,然后使用查询匹配数据

使用格式:使用bool关键字建查询和过滤连续起来

GET /索引/_search
{
    "query":{
        "bool":{
                   查询条件…………
                    "filter":{
                        …………过滤条件
                    }
        }
    }
}

注:

  • 在执行filter和query时,先执行filter再执行query
  • Elasticsearch会自动缓存经常使用的过滤器,以加快性能

过滤可以使用的类型:

  • term
  • terms
  • ranage
  • exists
  • ids
  • ……

例:筛选价格大于5000,名称带"雷"的电脑(雷神911)

GET /products/_search
{
  "query":{
    "bool": {
      "must": [
        {
          "term": {
            "title": {
              "value": "雷"
            }
          }
        }
      ],
      "filter": [
        {
          "range": {
            "price": {
              "gt": 5000
            }
          }
        }
      ]
    }
  }
}