elasticsearch 文档更新操作:update和update_by_query

发布时间 2023-12-17 08:40:43作者: king_wq_庆

API:

(elasticsearch版本7.3)
POST /<index>/_update/<_id>
POST /<index>/_update_by_query

1. POST /<index>/_update/<_id>

  1. 支持脚本,可以更新、删除或跳过修改文档。
  2. 更新文档部分内容,传递部分文档,将其合并到现有文档中。
#测试--post/update 脚本修改文档
POST /king_test_person/_update/223
{
    "script" : {
        "source": "ctx._source.birthday = params.birthday",
        "lang": "painless",
        "params" : {
            "birthday" : "2023-10-01"
        }
    }
}

#测试--post/update 部分修改文档
POST /king_test_person/_update/223
{
    "doc": {
      "name": "王五6"
    }
}

2. POST /<index>/_update_by_query

  1. 批量修改匹配到查询条件的文档
  2. 修改mapping结构

2.1 没有查询条件,全部修改

#测试--_update_by_query
POST /king_test_person/_update_by_query
{
    "script": {
      "source": "ctx._source.sex='女'",
      "lang": "painless"
    }
  }
}
总共8条数据,更新8条数据

2.2 有查询条件,修改匹配的文档 

只修改name=王五4 的数据。
#测试--_update_by_query
POST /king_test_person/_update_by_query
{
    "script": {
      "source": "ctx._source.sex='男'",
      "lang": "painless"
    },
  "query":{
      "term": {
      "name": "王五4"
    }
  }
}

 

3. 修改mapping

3.1 按查询条件修改

给id=223的文档,添加地址
#测试--_update_by_query 修改mapping结构
POST /king_test_person/_update_by_query
{
    "script": {
        "source": "ctx._source['address'] = \"四川省成都市\"",
      "lang": "painless"
    },
  "query":{
      "term": {
      "_id": 223
    }
  }
}

 

查询可以看到,只有id=223的文档有属性address

3.2 全部修改

不加查询限制,会更新所有文档
#测试--_update_by_query 修改mapping结构
POST /king_test_person/_update_by_query
{
    "script": {
        "source": "ctx._source['address'] = \"四川省成都市\"",
      "lang": "painless"
    }
}