【Elasticsearch-05】文档基本CRDU与批量操作

1. 文档CRDU规则

  • 规则:
PUT/POST/GET/DELETE 索引名称/_doc
  • 文档相关的操作Type都用_doc
操作举个栗子说明
indexPUT my_index/_doc/1
{“user”:“Mike”, “comment”:“You know, for search”}
如果ID不存在,创建新的文档,否则,先删除现有的文档,再创建新的文档,版本会增加
createPUT my_index/_create/1
{“user”:“Mike”, “comment”:“You know, for search”}
POST my_index/_doc (不指定ID, 自动生成)
{“user”:“Mike”, “comment”:“You know, for search”}
- 有两种方式,
- 1. 指定ID
- 2. 不指定ID,系统自动生成一串随机字符串
- 如果ID已经存在,会失败
readGET my_index/_update/1
updatePOST my_index/_update
{“doc”: {“user”:“Mike”, “comment”:“You know, for search”}}
文档必须已经存在,更新只会对相应字段做增量修改
deleteDELETE my_index/_doc/1

Kibana 实际操作

  • 打开Dev Tool,先创建一个索引
    图片: https://uploader.shimo.im/f/26IyWjgUJGEo0Uod.png
    图片: https://uploader.shimo.im/f/nBrbt8eHE3EtH9gS.png
Create 一个文档
  • 支持自动生成文档ID和指定文档ID两种方式:
      1. 指定文档ID创建:
PUT users/_create/1
{
  "firstName":"Jinjuan",
  "lastName": "Wu",
  "tags":["Java", "ElasticSearch"]
}
  • 1.1 操作成功
    图片: https://uploader.shimo.im/f/iIlOAb67SskJAFUs.png

    1. 不指定文档ID创建
POST /users/_doc
{
  "firstName":"Jinjuan1",
  "lastName": "Wu",
  "tags":["Java", "ElasticSearch"]
}
  • 2.1 创建成功
    图片: https://uploader.shimo.im/f/OsOVPC2b2ZU3rUI5.png

  • 使用HTTP PUT users/_create/1创建时,URI中显示指定_create,此时如果该ID的文档已经存在,显示操作失败
    图片: https://uploader.shimo.im/f/p1o3pmmLLHkwdH9M.png
    图片: https://uploader.shimo.im/f/bIApZGCAAg0avdzM.png

Get一个文档

图片: https://uploader.shimo.im/f/wZc8g4ad8EkAzfaS.png
图片: https://uploader.shimo.im/f/QJW5LFOsgr8FJSAJ.png

  • 文档源信息:
字段说明
_index索引名称
_type版本信息,同一个Id的文档,即使被删除,Version号也会不断增加
version版本信息,同一个Id的文档,即使被删除,Version号也会不断增加
_source默认包含了文档的所有原始信息
Index文档
  • Index和Update还有Create不一样的地方:如果文档不存在,就索引新的文档,否则现有文档会被删除,新的文档会被索引,版本信息 + 1
PUT users/_doc/1
{
  "tags":["少女", "女汉子"]
}

图片: https://uploader.shimo.im/f/xBNOMAYVNTEtCudy.png

  • GET users/_doc/1 查看一下,firstName和lastName都没了
    图片: https://uploader.shimo.im/f/IXYi6dspv1YEAnr3.png
Update文档
  • Update方法不会删除原来的文档,而是实现真正的数据更新
  • Post方法 / Payload,注意:需要包含在**“doc”**中
更新没有的字段

图片: https://uploader.shimo.im/f/pyloIm4W7HwzDvsg.png
图片: https://uploader.shimo.im/f/QO1mzxlZ54g5c2oe.png

Get一下

图片: https://uploader.shimo.im/f/5QTJJpMlnqAg537K.png

更新已存在的字段
POST users/_update/1
{
  "doc":{
    "tags" : [
      "是少女啊",
      "女汉子"
    ],
    "emails":["532791689@qq.com","wujinjuan5@163.com"]
  }
}

图片: https://uploader.shimo.im/f/3bPGwjYLwhIQncPu.png

Bulk API

背景:频繁地调用API查询会增加时间成本,就像多次连接数据库带来的成本一样,Bulk API能做到:

  • 在一次API调用中,对不同的索引进行操作
  • 支持四种类型操作
    • index
    • create
    • update
    • delete
  • 可以在URI中指定index,也可以在请求的Payload中进行
  • 操作中单条操作失败,并不会影响其他操作
  • 返回结果包罗了每一条操作执行的结果
Bulk的格式
{action:{metadata}}\n
{requestbody}
action(行为)说明
create文档不存在时创建
create更新文档
index创建新文档或替换已有文档
delete删除一个文档
  • metadata:_index, _type, _id
  • requestbody: 请求体参数们
示例
POST _bulk
{"index":{"_index":"users", "_id":"1"}}
{"tags":"532791689@qq.com"}
  • 如果你不想每个操作都写_index的话,你可以在POST后面指定索引名,比如这样:(前提是操作同一个索引)
POST /users/_bulk
{"index":{"_id":"1"}}
{"tags":"532791689@qq.com"}
批量添加
POST /users/_bulk
{"create":{"_id":5}}
{"firstName" : "San", "lastName" : "Zhang"}
{"create":{"_id":6}}
{"firstName" : "Wu", "lastName" : "Zhao"}

图片: https://uploader.shimo.im/f/kg1X2E7vwpg0SWND.png

批量删除
POST /users/_bulk
{"delete":{"_id":5}}
{"index":{"_id":8}}
{"name":"zhangsan"}
{"delete":{"_id":6}}

图片: https://uploader.shimo.im/f/a38K6HzjfvcPvsvn.png
图片: https://uploader.shimo.im/f/AsywjW5b5Sgab415.png

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

批量获取 - mget

  • 批量操作,可以减少网络连接所产生的开销,提高性能
GET /users/_mget
{
  "ids":["1","2","3","4","5","6"]
}
  • 查询结果太长,截图不全就放到代码块了。可见,查不到的数据会显示found:false
    图片: https://uploader.shimo.im/f/vNLOYbk3D88EOdHM.png
{
  "docs" : [
    {
      "_index" : "users",
      "_type" : "_doc",
      "_id" : "1",
      "_version" : 16,
      "_seq_no" : 19,
      "_primary_term" : 1,
      "found" : true,
      "_source" : {
        "tags" : [
          "是少女啊",
          "女汉子"
        ],
        "emails" : [
          "532791689@qq.com",
          "wujinjuan5@163.com"
        ],
        "firstName" : "Jinjuan",
        "lastName" : "Wu"
      }
    },
    {
      "_index" : "users",
      "_type" : "_doc",
      "_id" : "2",
      "_version" : 2,
      "_seq_no" : 16,
      "_primary_term" : 1,
      "found" : true,
      "_source" : {
        "title" : "Html5",
        "price" : 45
      }
    },
    {
      "_index" : "users",
      "_type" : "_doc",
      "_id" : "3",
      "_version" : 1,
      "_seq_no" : 3,
      "_primary_term" : 1,
      "found" : true,
      "_source" : {
        "firstName" : "Da",
        "lastName" : "Wu",
        "tags" : [
          "Java",
          "ElasticSearch"
        ]
      }
    },
    {
      "_index" : "users",
      "_type" : "_doc",
      "_id" : "4",
      "found" : false
    },
    {
      "_index" : "users",
      "_type" : "_doc",
      "_id" : "5",
      "_version" : 1,
      "_seq_no" : 20,
      "_primary_term" : 1,
      "found" : true,
      "_source" : {
        "firstName" : "San",
        "lastName" : "Zhang"
      }
    },
    {
      "_index" : "users",
      "_type" : "_doc",
      "_id" : "6",
      "_version" : 1,
      "_seq_no" : 21,
      "_primary_term" : 1,
      "found" : true,
      "_source" : {
        "firstName" : "Wu",
        "lastName" : "Zhao"
      }
    }
  ]
}

常见错误返回

问题原因
无法连接网络故障或集群挂了
连接无法关闭网络故障或节点出错
429集群过于繁忙
4xx请求体格式有错
500集群内部错误
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值