在本教程中,我们磋商了从 ElasticSearch 中删除数据的各种方法,从删除单个文档到管理生产环境中的大规模删除。
2. 删除单个文档首先,ElasticSearch 供应了几种从索引中删除单个文档的方法。
首先,从 ElasticSearch 中删除单个文档的最大略方法可能是利用 Delete API。当我们知道确切的文档 ID 和索引名称时,此方法是空想的选择:

$ curl -X DELETE "localhost:9200/customers/_doc/1"{"_index":"customers","_id":"1","_version":3,"result":"deleted","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":20,"_primary_term":1}
在这个例子中, customers是索引的名称, 1是我们要删除的文档的 ID。
当我们实行此命令时,ElasticSearch 会考试测验从 customers索引中删除 ID 为1 的文档。随后,如果该文档存在且被成功删除,ElasticSearch 将返回JSON相应,表明操作成功。
2.2. 利用查询删除另一方面,当我们须要删除符合特定条件的多个文档时,Delete By Query API 更为高效。此方法可以根据查询删除文档,类似于我们搜索文档的办法:
$ curl -X POST "localhost:9200/customers/_delete_by_query" -H 'Content-Type: application/json' -d'{ "query": { "range": { "last_purchase_date": { "lt": "now-1y" } } }}'{"took":258,"timed_out":false,"total":4,"deleted":4,"batches":1,"version_conflicts":0,"noops":0,"retries":{"bulk":0,"search":0},"throttled_millis":0,"requests_per_second":-1.0,"throttled_until_millis":0,"failures":[]}
让我们分解一下这个例子:
我们向客户索引的 _delete_by_query端点发送一个 POST 要求我们利用 范围查询来查找 last_purchase_date字段距今不到一年的所有文档now-1y是 ElasticSearch 日期数学表达式,意思是“从当前韶光算起一年前”此查询将删除上次购买韶光超过一年的所有客户文档,因此,这是一种根据特定标准删除过期或不干系数据的有效方法。
但是,利用Delete By Query时我们须要把稳以下几点:
该操作不是原子的:如果中途失落败,一些文档可能已被删除,而其他文档仍保留对付大型数据集来说,可能会占用大量资源:最好在非高峰时段运行此类操作我们还可以添加一个 size参数来限定单次操作删除的文档数量。这可以进一步帮助管理集群上的负载。
3.批量删除操作连续先容更有效的大规模删除方法,当处理大量文档时,批量操作可以显著提高性能。Bulk API 在单个要求中实行多个删除操作,从而减少网络开销并提高整体效率。
让我们看一个示例,理解如何利用 Python 和 ElasticSearch 客户真个 Bulk API 进行删除:
from elasticsearch import Elasticsearch, helperses = Elasticsearch(["http://localhost:9200"])def generate_actions(inactive_customer_ids): for customer_id in inactive_customer_ids: yield { "_op_type": "delete", "_index": "customers", "_id": customer_id }inactive_customer_ids = ["3", "5", "8"]response = helpers.bulk(es, generate_actions(inactive_customer_ids))print(f"Deleted {response[0]} documents")
首先,我们创建一个 ElasticSearch 客户端实例,连接到本地 ElasticSearch 做事器。然后,我们定义一个天生器函数generate_actions,为每个客户 ID 天生删除操作。之后,我们创建一个非生动客户 ID 列表。在实际场景中,这样的列表可能来自数据库查询或其他数据源。
随后,我们利用赞助函数.bulk()实行批量删除操作。末了,我们打印已删除的文档数量。
现在,让我们运行脚本:
$ python3 bulk-removal.py Deleted 3 documents
Bulk API 比为每个文档发送单独的删除要求更有效,由于它减少了到 ElasticSearch 集群的网络来回次数以及实际内部操作期间的开销。
4. 利用索引操作删除数据除了文档级操作外,有时我们可能须要删除较大的数据块。在这种情形下,索引级操作可能更有效。
4.1. 删除全体索引如果我们须要从索引中删除所有数据,则删除全体索引是最快的方法:
$ curl -X DELETE "localhost:9200/customers"{"acknowledged":true}
此命令删除 客户索引及其所有数据。值得把稳的是,这是一个非常快的操作,但它也是不可逆的。
当管理基于韶光的索引并想要删除旧数据时,此方法很有用。例如,这是删除上个月的日志索引的常用方法。
4.2. 利用别名实现零停机重修索引对付能够删除数据同时保持可用性的更细致的方法,我们可以利用索引别名。当我们想要从索引中删除数据子集而不产生任何停机韶光时,此方法特殊有用。
首先,我们为现有索引创建别名:
$ curl -X POST "localhost:9200/_aliases" -H 'Content-Type: application/json' -d'{ "actions": [ { "add": { "index": "customers", "alias": "current_customers" }} ]}'{"acknowledged":true,"errors":false}
然后,我们利用更新的设置创建一个新的索引:
$ curl -X PUT "localhost:9200/customers_v2" -H 'Content-Type: application/json' -d'{ "mappings": { "properties": { "email": { "type": "keyword" }, "name": { "type": "text" } } }}'{"acknowledged":true,"shards_acknowledged":true,"index":"customers_v2"}
接下来,我们重新索引数据,打消不生动的客户:
$ curl -X POST "localhost:9200/_reindex" -H 'Content-Type: application/json' -d'{ "source": { "index": "customers", "query": { "bool": { "must_not": { "term": { "status": "inactive" } } } } }, "dest": { "index": "customers_v2" }}'{"took":251,"timed_out":false,"total":7,"updated":0,"created":7,"deleted":0,"batches":1,"version_conflicts":0,"noops":0,"retries":{"bulk":0,"search":0},"throttled_millis":0,"requests_per_second":-1.0,"throttled_until_millis":0,"failures":[]}
末了,我们将别名切换为新索引:
$ curl -X POST "localhost:9200/_aliases" -H 'Content-Type: application/json' -d'{ "actions": [ { "remove": { "index": "customers", "alias": "current_customers" }}, { "add": { "index": "customers_v2", "alias": "current_customers" }} ]}'{"acknowledged":true,"errors":false}
利用此方法,运用程序可以在全体过程中连续对current_customers别名进行读写 。一旦重新索引完成并切换别名,就可以删除旧索引。
5. 结论在本文中,我们磋商了从 ElasticSearch 中删除数据的各种方法,从删除单个文档到管理生产环境中的大规模删除。我们先容了 Delete API、Delete By Query API、Bulk API 和索引级操作的利用。
通过这些技能,我们可以有效地管理 ElasticSearch 集群中的数据,确保最佳性能、遵守数据保留策略并高效利用存储资源。