批量更新
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)