首页 » SEO优化 » phpcurlputdelete技巧_从 ElasticSearch 中删除数据的几种办法

phpcurlputdelete技巧_从 ElasticSearch 中删除数据的几种办法

访客 2024-12-12 0

扫一扫用手机浏览

文章目录 [+]

在本教程中,我们磋商了从 ElasticSearch 中删除数据的各种方法,从删除单个文档到管理生产环境中的大规模删除。

2. 删除单个文档

首先,ElasticSearch 供应了几种从索引中删除单个文档的方法。

phpcurlputdelete技巧_从 ElasticSearch 中删除数据的几种办法

2.1. 利用删除 API

首先,从 ElasticSearch 中删除单个文档的最大略方法可能是利用 Delete API。
当我们知道确切的文档 ID 和索引名称时,此方法是空想的选择:

phpcurlputdelete技巧_从 ElasticSearch 中删除数据的几种办法
(图片来自网络侵删)

$ 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 集群中的数据,确保最佳性能、遵守数据保留策略并高效利用存储资源。

标签:

相关文章