• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
孙龙 程序员
少时总觉为人易,华年方知立业难
博客园    首页    新随笔    联系   管理    订阅  订阅
elasticsearch-索引的批量操作

elasticsearch-索引的批量操作

批量查询和批量增删改

  • 批量查询

GET /_mget

批量写入:

OST /_bulk
POST /<index>/_bulk
{"action": {"metadata"}}
{"data"}

注意:

​ bulk api对json的语法有严格的要求,除了delete外,每一个操作都要两个json串(metadata和business data),且每个json串内不能换行,非同一个json串必须换行,否则会报错;

​ bulk操作中,任意一个操作失败,是不会影响其他的操作的,但是在返回结果里,会告诉你异常日志

  • 索引的操作类型

    • create:如果在PUT数据的时候当前数据已经存在,则数据会被覆盖,如果在PUT的时候加上操作类型create,此时如果数据已存在则会返回失败,因为已经强制指定了操作类型为create,ES就不会再去执行update操作。比如:PUT /pruduct/_create/1/ ( 老版本的语法为 PUT /pruduct/_doc/1/_create )指的就是在索引product中强制创建id为1的数据,如果id为1的数据已存在,则返回失败。

    • delete:删除文档,ES对文档的删除是懒删除机制,即标记删除。(lazy delete原理)

    • index:在ES中,写入操作被称为Index,这里Index为动词,即索引数据为将数据创建在ES中的索引,写入数据亦可称之为“索引数据”。可以是创建,也可以是全量替换

    • update:执行partial update(全量替换,部分替换)

    • 以上四种操作类型均为写操作。ES中的数据写入均发生在Primary Shard,当数据在Primary写入完成之后会同步到相应的Replica Shard。ES的数据写入有两种方式:单个数据写入和批量写入,ES为批量写入数据提供了特有的API:_bulk。底层原理在我的《Elasticsearch底层原理》有详细介绍*

  • 优缺点

    • 优点:相较于普通的Json格式的数据操作,不会产生额外的内存消耗,性能更好,常用于大数据量的批量写入
    • 缺点:可读性差,可能会没有智能提示。
  • 使用场景

    大数据量的批量操作,比如数据从MySQL中一次性写入ES,批量写入减少了对es的请求次数,降低了内存开销以及对线程的占用。

 #批量查询

GET product/_search
GET /_mget
{
  "docs": [
    {
      "_index": "product",
      "_id": 2
    },
    {
      "_index": "product",
      "_id": 3
    }
  ]
}

GET product/_mget
{
  "docs": [
    {
      "_id": 2
    },
    {
      "_id": 3
    }
  ]
}
#SELECT * FROM TABLE WHERE id in()
GET product/_mget
{
  "ids": [
    2,
    3,
    4
  ]
}

GET product/_mget
{
  "docs": [
    {
      "_id": 2,
      "_source": [
        "name",
        "price"
      ]
    },
    {
      "_id": 3,
      "_source": {
        "include": [
          "name",
          "price"
        ],
        "exclude": [
          "price",
          "type"
        ]
      }
    }
  ]
}

#======================================================
#对文档的操作类型: op_type

# enum OpType {
# INDEX(0),
# CREATE(1),
# UPDATE(2),
# DELETE(3)
# }

#create:

GET test_index/_doc/1
#不存在就创建 存在就更新(全量替换更新)
PUT test_index/_doc/1
{
  "test_field":"test",
  "test_title":"title"
}
#存在则报错 不存在则创建
PUT test_index/_doc/2/_create
{
  "test_field":"test",
  "test_title":"title"
}

#加上参数filter_path=items.*.error 当存在id=4记录 屏蔽错误
PUT test_index/_create/4?filter_path=items.*.error
{
  "test_field":"test",
  "test_title":"title"
}

#创建文档 不指定_id 自动创建_id 
POST test_index/_doc
{
  "test_field":"test",
  "test_title":"title"
}

 

#delete:懒删除
DELETE test_index/_doc/3

#update:

GET test_index/_search
GET test_index/_doc/0APggnkBPdz4eXq223h8
#全量替换字段 #全量替换和新增新字段
PUT /test_index/_doc/0APggnkBPdz4eXq223h8
{
  "test_field": "test 2",
  "test_title": "title 2"
}
#部分更新替换字段
POST /test_index/_update/0APggnkBPdz4eXq223h8
{
  "doc": {
    "test_title": "test 3"
  }
}

#index:可以使创建 也可以使全量替换

创建     PUT test_index/_create/0APggnkBPdz4eXq223h8
#全量替换 PUT test_index/_doc/0APggnkBPdz4eXq223h8
GET test_index/_doc/0APggnkBPdz4eXq223h8
#全量替换和新增新字段
PUT /test_index/_doc/5?op_type=index&filter_path=items.*.error
{
  "test_field": "test 2",
  "test_title": "title 2",
  "test_name": "title 2"
}

#?filter_path=items.*.error

 

########################################################
#批量增删改

########################################################
#批量增删改
#POST /_bulk
#POST /<index>/_bulk
#{"action": {"metadata"}}
#{"data"}
PUT /product/_doc/1
{
    "name" : "小米手机",
    "desc" :  "手机中的战斗机",
    "price" :  3999,
    "lv":"旗舰机",
    "type":"手机",
    "createtime":"2020-10-01T08:00:00Z",
    "tags": [ "性价比", "发烧", "不卡顿" ]
}



GET product/_search

POST _reindex
{
  "source": {
    "index": "product"
  },
  "dest": {
    "index": "product2"
  }
}
GET product2/_search
GET product2/_doc/4
GET product/_doc/4
POST /_bulk
{ "create": { "_index": "product2",  "_id": "2" }}
{ "name":    "_bulk create 2" }
{ "create": { "_index": "product2",  "_id": "12" }}
{ "name":    "_bulk create 12" }
{ "index":  { "_index": "product2",  "_id": "3" }}
{ "name":    "index product2 "}
{ "index":  { "_index": "product2",  "_id": "13" }}
{ "name":    "index product2" }
{ "update": { "_index": "product2",  "_id": "4","retry_on_conflict" : "3"} }
{ "doc" : {"test_field2" : "bulk test1"} }

#加?filter_path=items.*.error  只显示失败的
POST /_bulk?filter_path=items.*.error
{ "delete": { "_index": "product2",  "_id": "1" }}
{ "create": { "_index": "product2",  "_id": "2" }}
{ "name":    "_bulk create 2" }
{ "create": { "_index": "product2",  "_id": "12" }}
{ "name":    "_bulk create 12" }
{ "index":  { "_index": "product2",  "_id": "3" }}
{ "name":    "index product2 " }
{ "index":  { "_index": "product2",  "_id": "13" }}
{ "name":    "index product2" }
{ "update": { "_index": "product2",  "_id": "4","retry_on_conflict" : "3"} }
{ "doc" : {"test_field2" : "bulk test1"} }

 

本文来自博客园,作者:孙龙-程序员,转载请注明原文链接:https://www.cnblogs.com/sunlong88/p/17399604.html

posted on 2023-05-14 16:58  孙龙-程序员  阅读(131)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3