ElasticSearch(4)--使用Kibana实现增删改查

利用Kibana实现基本的CRUD操作

根据我们之前学到的内容,先启动es,再启动kibana,访问ip+5601(默认端口),我的环境是访问

192.168.0.108:5601

访问页面是
在这里插入图片描述
(1)点击左侧的Dev Tools,进入操作页面
(2)操作页面如下:
在这里插入图片描述
(3)Kibana的CRUD的相关操作

添加索引:
PUT /lib/

{

"settings":{

"index":{
  
    "number_of_shards": 5,
    
    "number_of_replicas": 1
    
    }
    
  }
}

其中
PUT /lib/:表示的是新建索引,相当于新建一个数据库
“number_of_shards”:3:表示的是分片的个数,注意,分片一旦成功分好,将不能再改变

分片就是将一个索引切分成多个,每一个就是一个分片

“number_of_replicas”:1:表示备份的数量
在这里插入图片描述
上图表示建立了一个名字是zyf的索引(数据库),当出现右边的信息的时候,表示我们已经创建成功了。

  • 我们还可以直接用默认配置创建索引(数据库)
PUT lib2

在这里插入图片描述

  • 查看某一个索引的配置:
GET /索引名称/_settings

例如:

GET /lib2/_settings
或者
GET lib2

结果如图
在这里插入图片描述
通过右边的结果可以看到
“number_of_shards”: “5” : 表示分片是5个
“number_of_replicas”:“1”:表示的是备份的数量是1

  • 同时查看所有索引
GET _all/_settings

在这里插入图片描述
如上图所示,显示所有索引的详细配置。

添加文档
(1) 指定ID添加文档(用PUT)

文档相当于是数据库表中的一条记录
具体操作:

PUT /lib/user/1
{ "first_name" : "Jane",

"last_name" :   "Smith",

"age" :         32,

"about" :       "I like to collect rock albums",

"interests":  [ "music" ]
}
  • PUT /lib/user/1
    表示当前的索引是lib(数据库)
    当前的type是user(数据库中的一张表)
    当前的文档的id是1(数据库中一条记录的主键)
    /索引(数据库)/type(表)/主键
    这里强调一点, PUT命令和下面的具体数据之间不要有空白行
    在这里插入图片描述
(2)不指定ID添加文档(用POST方式)

上面我们学习了指定ID的方式添加文档,若我们不想指定ID呢?
如果我们不想指定ID,用POST方式进行提交就行,es默认生成一个ID(随机的无规律的)

POST /lib/user/
{ "first_name" : "Douglas",

"last_name" :   "Fir",

"age" :         23,

"about":        "I like to build cabinets",

"interests":  [ "forestry" ]
}

在这里插入图片描述
可以看到我们没有指定ID,利用POST提交,ES为我们随机生成了一个ID

查询文档

(1)利用GET
(2)指定索引,类型,id

GET /lib/user/1

查询索引是lib,类型是type,索引是1的数据(可以理解为查询数据库是lib表明是user且记录的id为1的哪一行数据)
在这里插入图片描述
若我们想获取指定的字段的值,并不想获取所有得到字段
观察上面的结果我们将查询的字段,都放在了_source中,所以我们获取指定的字段只需要

GET /lib/user/1?_source=字段1字段2...

举例说明

GET /lib/user/1?_source=age,about
注意一下,字段之间用","隔开 ,不能有空格

即可以是 _source=a,b 但不能是_source=a, b(a和b之间有空格)
在这里插入图片描述
查看上面的结果可以看到,我们只查询出了指定字段age和about的值

更新文档

  • 第一种方式就是用一个同样索引,类型和id的数据直接去覆盖掉,这时候result的结果显示为updated
    在这里插入图片描述
    如上图所示,我们将age做了修改,直接将其覆盖,可以看到右边的结果,其中_version和result字段都发生了改变。

  • 第二种方式就是直接进行修改而不是覆盖的方式(使用POST)

POST lib/user/1/_update
{
	"doc":{
		"age":33
	}
}

上面的含义是修改lib索引中type是user的且id是1的文档,_update表示更新操作,doc中的内容就是我们要修改的字段的值
在这里插入图片描述

  • 删除文档

(1)删除一个文档

DELETE /lib/user/1

(2)删除一个索引

DELETE /lib

综上所述删除用DELETE。删除索引时候,只用具体到索引,删除文档需要具体到指定类型(表)的具体的id

批量获取文档

使用es提供的Multi Get API可以实现文档的批量处理,使用Multi Get API可以通过索引,类型名,文档id一次得到一个文档集合,文档可以来自同一个索引库,也可以来自不同的索引库

GET /_mget
{
"docs":[
   
   {
       "_index": "lib",
       "_type": "user",
       "_id": 1
   },
   {
       "_index": "lib",
       "_type": "user",
       "_id": 2
   },
   {
       "_index": "lib",
       "_type": "user",
       "_id": 3
   }
   
 ]
}

我们通过GET /_mget的命令来批量获取内容。
docs:固定的key,是一个数组,该数组中存放了我们要批量获取的的索引,类型,以及文档id
上面的结果是:
在这里插入图片描述
从上面的结果可以看到,我们在取值lib索引,类型是user,id是1的数据是可以取到的取出的数据存放到_source中,其余的两个没有取出。

  • 批量取出指定字段

上面我们是通过GET /_mget直接获取所有的内容,若我们想获取指定字段的值呢?

GET /_mget
{

"docs":[
   
   {
       "_index": "lib",
       "_type": "user",
       "_id": 2,
       "_source": "interests"
   },
   {
       "_index": "lib",
       "_type": "user",
       "_id": 1,
       "_source": ["age","interests"]
   }
   
 ]
}

通过上面的代码我们可以看到我们在docs数组中除了指定index,type,id之外还额外指明了_source的属性,该属性就是指明我们需要具体获得的哪一个字段。
在这里插入图片描述

  • 获取相同索引相同类型下的不同文档
GET /lib/user/_mget
{
"docs":[
   {
       "_id": 2
   },
   {
       "_id": 1
   }
 ]
}

通过上面的命令我们可以总结下,要想获取相同索引相同类型下的不同文档,只需要把相同的部分提取出来就行:
GET /_mget -----> GET /lib/user/_mget
我们将其相同的index和type都提取出来只在docs中写各自的id属性。
在这里插入图片描述
上面的代码可以再一步简写:

GET /lib/user/_mget
{

"ids": ["1","2"]

}

直接不写docs属性,直接写ids,将要获取的id写进去。

使用Bulk API 实现批量操作

我们使用的MultiGet只能实现批量获取,不能实现其他功能

  • bulk的格式
{action:{metadata}}
{requestbody}

重要属性介绍:

  • action(行为)
  1. create: 文档不存在时候创建,存在的时候不能创建,报错
  2. update:更新文档
  3. idnex:创建新文档或者替换已经存在的文档
  4. delete:删除一个文档
  • metadata:_index,_type,_id

create和index的区别
如果数据存在,使用create操作失败,会提示文档已经存在,使用index则可以执行成功,index可以用来进行文档的新建和覆盖。

下面我们举例说明:

  • bulk实现批量删除

删除是没有请求体的

POST  /lib/user/_bulk
{"delete":{"_index":"lib","_type":"user","_id":"1"}}

批量删除index是lib的,type是user,id是1的文档。注意,我们必须要在前面加上GET、POST、PUT等。

  • bulk实现批量新增
POST /lib2/books/_bulk
{"index":{"_id":1}}
{"title":"Java","price":55}
{"index":{"_id":2}}
{"title":"Html5","price":45}
{"index":{"_id":3}}
{"title":"Php","price":35}
{"index":{"_id":4}}
{"title":"Python","price":50}

上面就是批量新增的代码
action用的是index,表示的是文档不存在就新建,存在就覆盖
metadata这里只规定了其id
下面的内容就是{requestbody},表示的是具体的内容。
上面的意思是批量添加indedx是lib2,类型是books的bulk的批量新增,新增的内容是id为1,2,3,4具体内容是title和price属性。

  • bulk实现批量修改
POST /lib2/books/_bulk
{"create":{"_index":"tt","_type":"ttt","_id":"100"}}
{"name":"lisi"}
{"index":{"_index":"tt","_type":"ttt"}}
{"name":"zhaosi"}
{"update":{"_index":"tt","_type":"ttt","_id":"100"}}
{"doc":{"name":"zyf"}}
{"delete":{"_index":"tt","_type":"ttt","_id":"100"}}

上面的代码不止是批量修改,而是批量的新增(create方式和index方法),更改和删除,注意我们在index的时候,并没有指明id,表示我们的id交给ES随机生成一个。
结果如下:

{
  "took": 21,
  "errors": false,
  "items": [
    {
      "create": {
        "_index": "tt",
        "_type": "ttt",
        "_id": "100",
        "_version": 4,
        "result": "created",
        "_shards": {
          "total": 2,
          "successful": 1,
          "failed": 0
        },
        "_seq_no": 3,
        "_primary_term": 1,
        "status": 201
      }
    },
    {
      "index": {
        "_index": "tt",
        "_type": "ttt",
        "_id": "ZaQwRWoB5TO9HheIe6-h",
        "_version": 1,
        "result": "created",
        "_shards": {
          "total": 2,
          "successful": 1,
          "failed": 0
        },
        "_seq_no": 1,
        "_primary_term": 1,
        "status": 201
      }
    },
    {
      "update": {
        "_index": "tt",
        "_type": "ttt",
        "_id": "100",
        "_version": 5,
        "result": "updated",
        "_shards": {
          "total": 2,
          "successful": 1,
          "failed": 0
        },
        "_seq_no": 4,
        "_primary_term": 1,
        "status": 200
      }
    },
    {
      "delete": {
        "_index": "tt",
        "_type": "ttt",
        "_id": "100",
        "_version": 6,
        "result": "deleted",
        "_shards": {
          "total": 2,
          "successful": 1,
          "failed": 0
        },
        "_seq_no": 5,
        "_primary_term": 1,
        "status": 200
      }
    }
  ]
}
bulk一次最大的处理数据量

bulk会把将要处理的数据载入内存中,所以数据量是有限的,最佳的数据量不是一个确定的数值,取决于你的硬件,你的文档大小以及复杂性,你的索引以及搜索的负载。
一般建议是1000-5000个文档,大小是5-15M,默认不超过100M,可以在es的配置文件(即$ES_HOME下的config下的elasticsearch.yml)设置。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值