ElasticSearch 文档操作(第四章)

ElasticSearch 目前也算是非常火了,站内搜索、日志分析都会用到它,而且还可以直接当成 NoSQL 数据库来使用。
接下来,我们就通过下面这个简单介绍,开启 es 之旅吧~

公众号 : 倔强小狮子

在这里插入图片描述


1. 新建文档

  1. 先进行创建 index, 当创建文档时索引如果不存在ElasticSearch会进行创建当前 index

  2. POST index/_doc/id

    POST lionet/_doc/2
    {
      "title":"倔强的小狮子",
      "data" : "2021-04-03",
      "content":"公众号 : 倔强的小狮子"
    }
    
  3. 表示新建文档的 id。
    在这里插入图片描述

  • _index 表示文档索引。
  • _type 表示文档的类型。
  • _id 表示文档的 id。
  • _version 表示文档的版本(更新文档,版本会自动加 1,针对一个文档的)。
  • result 表示执行结果。
  • _shards 表示分片信息。
  • _seq_no 和 _primary_term 这两个也是版本控制用的(针对当前 index)。
  • _index 表示文档索引。
  1. 当然,添加文档时,也可以不指定 id,此时系统会默认给出一个 id,如果不指定 id,则需要使用 POST 请求,而不能使用 PUT 请求。

2. 获取文档

  1. Es 中提供了 GET API 来查看存储在 es 中的文档。
    GET index/_doc/id
    GET lionet/_doc/1 上述 在 名为 lionet 的索引中获取 id为1的文档,如果获取不存在 id的文档则出现以下结果
    在这里插入图片描述

  2. 如果仅仅只是想探测某一个文档是否存在,可以使用 head 请求:
    HEAD index/_doc/id
    HEAD lionet/_doc/12?pretty=true
    在这里插入图片描述
    在这里插入图片描述

  3. 当然了也可以进行批量获取文档
    GET index/_mget

    GET lionet/_mget
    {
      "ids":["1","2]
    }
    

在这里插入图片描述
这里是否存在 GET 请求竟然可以携带 请求体 ?
其实在某些语言中,例如 JavaScript 的 HTTP 请求库是不允许 GET 请求有请求体的,实际上在 RFC7231 文档中,并没有规定 GET 请求的请求体该如何处理 ,有的 HTTP 服务器支持 GET 请求携带请求体,有的 HTTP 服务器则不支持,所以 ES 开发工程师使用了 GET 请求可以携带 Body了,例如上面案例其实也可以 使用 POST请求进行查询的

3. 文档更新

注意,文档更新一次,version 就会自增 1。

  1. 普通更新
    可以直接更新整个文档:

    POST lionet/_doc/1
    {
      "title":"小狮子",
      "data" : "2021-04-03",
      "content":"公众号 : 倔强的小狮子"
    }
    

在这里插入图片描述

  • 这种方式,更新的文档会覆盖掉原文档。
  • 大多数时候,我们只是想更新文档字段,怎么办呢? 别急我们是可以通过脚本来实现
  • 更新的请求格式:POST {index}/_update/{id}
POST lionet/_update/1
{
  "script": {
    "lang": "painless",
    "source": "ctx._source.title=params.title",
    "params": {
      "title":"倔强的小狮子"
    }
  }
}

在 script(脚本中), lang 表示脚本语言,painless是es内置的一种脚本支持语言, source 表示当前待执行的脚本, ctx是一个上下文对象,通过ctx可以获取 _source, 通过 _source可以获取到文档

4. 文档新增字段

  1. 当我们进行文档时,如果当前 JSON 文档中在 es 现有文档中不存在时,是可以使用 进行新增字段的( POST {index}/_update/{id}上面存在案例) 不过也可以使用 脚本进行添加字段的

    POST lionet/_update/1
    {
      "script": {
        "lang": "painless",
        "source":"ctx._source.tags=[\"java\",\"scala\"]"
      }
    }
    

注意 : 在使用 source 方式进行更新时 新的资源 双引号是需要进行转义的
在这里插入图片描述
2. 也可以想 tags 添加新的元素

POST lionet/_update/1
{
  "script": {
    "lang": "painless",
    "source":"ctx._source.tags.add(\"Python\")"
  }
}
  1. 当然,也可以使用 if else 构造稍微复杂一点的逻辑
POST lionet/_update/1
{
  "script": {
    "lang": "painless",
    "source": "if (ctx._source.tags.contains(\"Python\")){ctx.op=\"delete\"}else{ctx.op=\"none\"}"
  }
}

ctx.op="指令", delete : 删除, none : 不做任何操作

5. 查询更新

  1. 通过条件查询找到文档,然后再去更新。
    例如将 title 中包含 小狮子 的文档的 content 修改为 **** 公众号搜索倔强的小狮子 ****
POST lionet/_update/1
{
  "script": {
    "lang": "painless",
    "source": "ctx._source.centent=\"公众号搜索倔强的小狮子\""
  }
}

在这里插入图片描述

6.删除文档

  1. 根据 id 删除
    删除一个 id 为 1 的文档。
    DELETE index/_doc/id
    DELETE lionet/_doc/1
    

在这里插入图片描述
注意 : 如果在添加文档时指定了路由,则删除文档时也需要指定路由,否则删除失败。后面会聊到路由概念

  1. 查询删除是 POST 请求。
    例如删除 title 中包含 懒惰 的文档:
    在这里插入图片描述
    POST index/_delete_by_query
    POST lionet/_delete_by_query
    {
      "query":{
        "match":{
          "title":"懒惰"
        }
      }
    }
    

在这里插入图片描述
3.也可以删除某一个索引下的所有文档:
POST index/_delete_by_query

POST lionet/_delete_by_query
{
  "query":{
    "match_all":{
      
    }
  }
}

7. 批量操作

  1. es 中通过 Bulk API 可以执行批量索引、批量删除、批量更新等操作。

  2. 首先需要将所有的批量操作写入一个 JSON 文件中,然后通过 POST 请求将该 JSON 文件上传并执行。

  3. 例如新建一个名为 es_lionet.json 的文件,内容如下:
    在这里插入图片描述
    注意: 文档最后一定要预留一个 空格一行,空格一行,空格一行,重要的事情说是三遍,这个地方实在有点坑

    curl -XPOST "http://ip:9221/lionet/_bulk"
     -H "content-type:application/json" 
     --data-binary @d:/es_lionet.json
    

在这里插入图片描述

注意 :
status: 201 : id 文档不存在进行创建文档
status: 200 : Id 文档存在更新文档

执行完成后,就会创建一个名为 lionet 的索引,同时向该索引中添加一条记录,再修改该记录,最终结果如下:
在这里插入图片描述

  1. 批量插入及更新
    在这里插入图片描述
    在这里插入图片描述
  • index 表示要执行一个索引操作(这个表示一个 action,其他的 action 还有 create,delete,update , _index 定义了索引名称,这里表示要创建一个名为 lionet 的索引,_id 表示新建文档的 id 为 1。
  • 第二行是第一行操作的参数。
  • 第三行的 update 则表示要更新。
  • 第四行是第三行的参数。
  • 注意,结尾要空出一行。

期待你的关注,和我一起学习
转载说明:转载携带原文链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值