批量更新

Elasticsearch 支持使用 _bulk API 进行批量更新操作。_bulk API 允许在一个请求中执行多个操作,如创建、索引、删除和更新。这样可以提高数据处理效率。

以下是一个使用 _bulk API 进行批量更新的示例:

假设您有一个名为 “my_index” 的索引,里面有一些文档,每个文档有一个 “status” 字段。现在您想要批量更新这些文档,将 “status” 的值从 “old” 更新为 “new”。

首先,创建一个名为 bulk_update.json 的文件,包含以下内容:

{"update":{"_id":"1","_index":"my_index"}}
{"doc": {"status":"new"}}
{"update":{"_id":"2","_index":"my_index"}}
{"doc": {"status":"new"}}
{"update":{"_id":"3","_index":"my_index"}}
{"doc": {"status":"new"}}
...

每两行代表一个更新操作。第一行指定操作类型(在本例中为更新操作)以及文档的索引和 ID。第二行提供需要更新的字段及其新值。

接下来,通过命令行工具(如 curl)或其他 Elasticsearch 客户端,发送一个 HTTP POST 请求到 _bulk API:

curl -X POST "localhost:9200/_bulk?pretty" -H 'Content-Type: application/json' --data-binary "@bulk_update.json"

这将执行批量更新操作。注意,为了提高性能,建议您在批量更新时使用适当的批次大小,以便在保持良好性能的同时处理大量文档。

另外,如果您需要根据查询条件批量更新文档,可以使用 _update_by_query API。例如,以下命令会将索引 “my_index” 中所有 “status” 值为 “old” 的文档的 “status” 更新为 “new”:

curl -X POST "localhost:9200/my_index/_update_by_query?conflicts=proceed" -H 'Content-Type: application/json' -d'
{
  "query": {
    "term": {
      "status": "old"
    }
  },
  "script": {
    "source": "ctx._source.status = \"new\""
  }
}
'

批量删除

要在 Elasticsearch 中批量删除文档,您可以使用 _bulk API 或 _delete_by_query API。

使用 _bulk API 进行批量删除:

创建一个名为 bulk_delete.json 的文件,包含要删除的文档的 ID 和索引信息。例如,假设您要从名为 “my_index” 的索引中删除 ID 为 1、2 和 3 的文档:

{"delete":{"_id":"1","_index":"my_index"}}
{"delete":{"_id":"2","_index":"my_index"}}
{"delete":{"_id":"3","_index":"my_index"}}

接下来,使用命令行工具(如 curl)或其他 Elasticsearch 客户端,发送一个 HTTP POST 请求到 _bulk API:

curl -X POST "localhost:9200/_bulk?pretty" -H 'Content-Type: application/json' --data-binary "@bulk_delete.json"

这将执行批量删除操作。

使用 _delete_by_query API 进行批量删除:

如果您需要根据查询条件批量删除文档,可以使用 _delete_by_query API。例如,以下命令会删除索引 “my_index” 中所有 “status” 值为 “old” 的文档:

curl -X POST "localhost:9200/my_index/_delete_by_query?conflicts=proceed" -H 'Content-Type: application/json' -d'
{
  "query": {
    "term": {
      "status": "old"
    }
  }
}
'

这将根据查询条件执行批量删除操作。

Kibana开发者工具里

在 Kibana 的 Dev Tools 中,您也可以使用 _bulk API 进行批量操作。以下是一个示例,演示如何在 Kibana Dev Tools 中批量创建、更新和删除文档:

假设您有一个名为 “my_index” 的索引,并且您想要使用 _bulk API 执行以下操作:

创建一个具有 ID 1 的文档。
更新具有 ID 2 的文档的 "status" 字段。
删除具有 ID 3 的文档。

在 Kibana Dev Tools 的控制台中,输入以下内容:

POST _bulk
{"index": {"_index": "my_index", "_id": "1"}}
{"title": "My new document", "status": "new"}
{"update": {"_index": "my_index", "_id": "2"}}
{"doc": {"status": "updated"}}
{"delete": {"_index": "my_index", "_id": "3"}}

在这个例子中:

第一行是一个 POST 请求,指定使用 _bulk API。
接下来的三对行分别代表创建、更新和删除操作。每对行的第一行描述操作类型(如 "index"、"update" 或 "delete")以及文档的索引和 ID。第二行提供了需要创建或更新的文档内容。

请注意,Kibana Dev Tools 中的请求与在命令行中使用 curl 发送的请求略有不同。在 Kibana 中,您不需要在每行前添加 curl 命令或 HTTP 请求方法(如 GET、POST 等),而只需在 Dev Tools 控制台中输入请求的主体部分。

完成输入后,单击控制台右上角的绿色三角形按钮或按 Ctrl+Enter(或 Cmd+Enter,取决于您的操作系统),Kibana 将执行请求并显示响应结果。

批量删除

POST index_test/_delete_by_query
{
  "query":{
    "term": {
      "cateid": {
        "value": "3832"
      }
    }
  }
}
post index_test/_delete_by_query
{
  "query": {
    "bool": {
      "must": [
        {
          "ids": {
            "values": [
              7439,
              9653,
              7208
            ]
          }
        }
      ]
    }
  }
}

批量更新

POST index_test/_update_by_query
{
  "script": {
    "inline": "ctx._source.source='来源'"
  },
  "query": {
    "term": {
      "cateid": {
        "value": "307"
      }
    }
  }
}

参考

更多关于批量操作和删除查询的信息,请参阅 Elasticsearch 文档:

_bulk API: [https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html](https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html)
_delete_by_query API: [https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-delete-by-query.html](https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-delete-by-query.html)
_update_by_query API: [https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-update-by-query.html](https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-update-by-query.html)