天天看点

Elasticsearch之delete_by_query和update_by_query

delete_by_query

delete_by_query方法会删除符合条件的记录,示例如下:

POST twitter/(doc_type, 5.x)/_delete_by_query
{
  "query": { 
    "match": {
      "message": "some message"
    }
  }
}
           

查询语句跟search api是一样的,很方便。

然后就会得到类似下面的结果:

{
  "took" : 147,
  "timed_out": false,
  "deleted": 119,
  "batches": 1,
  "version_conflicts": 0,
  "noops": 0,
  "retries": {
    "bulk": 0,
    "search": 0
  },
  "throttled_millis": 0,
  "requests_per_second": -1.0,
  "throttled_until_millis": 0,
  "total": 119,
  "failures" : [ ]
}
           
  • version_conflicts表示是否有数据版本冲突,因为开始要删除时,delete_by_query会得到索引快照并且使用内部版本号来找到要删除哪些文档。如果获取到快照与执行删除过程的这段时间内,有文档发生变化,那么版本就会冲突。另外版本冲突后可以设置conflicts=proceed跳过冲突。
  • retries表示重试次数,因为本操作是按批次处理的,当一个批次操作时可能会失败,这时候es会发起重试。
  • requests_per_second表示在通过查询删除期间有效执行的每秒请求数。
  • throttled_millis表示请求睡眠以符合requests_per_second的毫秒数。
  • throttled_until_millis:在delete_by_query响应中,此字段应始终等于零。 它只在使用Task API时有意义,它指示再次执行限制请求以符合requests_per_second。

任务模式

在delete_by_query中如果加上参数wait_for_completion=false就会开启任务模式,响应会直接返回一个task id,不用等待操作执行完毕。

可以通过api:

GET _tasks?detailed=true&actions=*/delete/byquery

查看正在执行的异步任务,

也可以直接通过

GET /_tasks/{task id}

直接查看异步任务的信息。

如果需要取消这个异步任务,则需要请求

POST _tasks/{task id}/_cancel

update_by_query

update_by_query的语法基本上和delete_by_query类似,但是因为增加了更新操作,所以语句内会增加相应的更新语句。

例如:

POST twitter/_update_by_query
{
    "script" : {
        "source": "ctx._source.counter += params.count",
        "lang": "painless",
        "params" : {
            "count" : 4
        }
    },
    "query": {
     "term": {
      "user": "kimchy"
    }
  }
}
           

或者:

POST twitter/_update_by_query
{
  "script": {
    "source": "ctx._source.likes++",
    "lang": "painless"
  },
  "query": {
    "term": {
      "user": "kimchy"
    }
  }
}
           

其他语法和delete_by_query一样,不再赘述,另外也提供异步任务模式。

继续阅读