Elasticsearch常用接口_update_by_query

根据条件更新某个属性信息:_index/_type/_update_by_query  POST

{
  "script": {
    "source": "ctx._source.更新属性名称 = '新的值'",
    "lang": "painless"
  },
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "查询属性名称": "查询值"
          }
        }
      ],
      "must_not": [],
      "should": []
    }
  }
}

更新替换某个字段的某些数据:_index/_type/_update_by_query  POST

例如:将moduleUrl 字段中的/dtmp/#/ 换成data-center/#/

{
  "script": {
    "source": "ctx._source.moduleUrl= ctx._source.moduleUrl.replace('/dtmp/#/', '/data-center/#/')"
  },
  "query": {
    "bool": {
      "must": [
        {
          "prefix": {
            "moduleUrl.keyword": "/dtmp/#/"
          }
        }
      ]
    }
  }
}

同时更新多个字段用分号隔开:

{
  "script": {
    "source": "source": "ctx._source.更新属性名称1 = '新的值1';ctx._source.更新属性名称2 = '新的值2'"
  },
  "query": {
    "bool": {
      "must": [
        {
          "prefix": {
            "moduleUrl.keyword": "/dtmp/#/"
          }
        }
      ]
    }
  }
}

`_update_by_query` 是 Elasticsearch 提供的一个强大的 API,用于根据查询条件批量更新文档。其工作原理如下: ### 1. 查询匹配 `_update_by_query` 首先会根据用户提供的查询条件在索引中查找匹配的文档。例如,在以下代码中: ```json { "query": { "term": { "_id": { "value": "bg8lgooBm62Q6jNaiSK4" } } } } ``` Elasticsearch 会在指定的索引中查找 `_id` 为 `bg8lgooBm62Q6jNaiSK4` 的文档。 ### 2. 脚本执行 对于每个匹配的文档,`_update_by_query` 会执行用户提供的脚本。脚本通常使用 Painless 语言编写,用于修改文档的 `_source` 字段。例如: ```json { "script": { "source": "ctx._source.k_VENDORID = params.newValue; if (!ctx._source.containsKey('t_CLEANTIME')) {def dateFormat = new SimpleDateFormat('yyyy-MM-dd HH:mm:ss'); ctx._source.t_CLEANTIME = dateFormat.format(new Date()) ; }", "lang": "painless", "params": { "newValue": "6666666666666666666666666666666666" } } } ``` 在这个脚本中,会将 `k_VENDORID` 字段更新为 `params` 中指定的 `newValue`,并且如果文档中不存在 `t_CLEANTIME` 字段,则会添加该字段并赋值为当前时间。 ### 3. 文档更新 脚本执行完成后,`_update_by_query` 会将修改后的文档重新索引到 Elasticsearch 中。这意味着实际上是删除旧文档并插入新文档,以实现更新操作。 ### 4. 批量处理 为了提高性能,`_update_by_query` 会批量处理匹配的文档。它会将匹配的文档分成多个批次,每个批次的大小可以通过参数进行调整。这样可以减少与 Elasticsearch 集群的交互次数,提高更新效率。 ### 5. 并发控制 在更新过程中,`_update_by_query` 会处理并发问题。如果在更新过程中其他操作也在修改同一文档,Elasticsearch 会使用版本控制机制来确保数据的一致性。 ### 示例代码 以下是一个使用 `_update_by_query` 的示例代码: ```json POST /test/_update_by_query { "script": { "source": "ctx._source.k_VENDORID = params.newValue; if (!ctx._source.containsKey('t_CLEANTIME')) {def dateFormat = new SimpleDateFormat('yyyy-MM-dd HH:mm:ss'); ctx._source.t_CLEANTIME = dateFormat.format(new Date()) ; }", "lang": "painless", "params": { "newValue": "6666666666666666666666666666666666" } }, "query": { "term": { "_id": { "value": "bg8lgooBm62Q6jNaiSK4" } } } } ``` ### 总结 `_update_by_query` 的核心原理是先查询匹配的文档,然后对每个匹配的文档执行脚本进行修改,最后将修改后的文档重新索引。通过批量处理和并发控制,它可以高效地完成批量更新操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值