弹性搜索 delete_by_query 是如何工作的?当我们插入新数据并在删除文档时检索相同数据时会发生什么?
How Elastic Search delete_by_query work ? What happens when we insert new data and retrieve the same while deleting documents?
我想了解更多有关弹性删除的信息,它是 Java 高级删除 api & 天气执行批量删除是可行的。
配置信息如下
- Java: 8
- 弹性版本:7.1.1
已添加弹性依赖项:
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.1.1</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>7.1.1</version>
</dependency>
在我的例子中,每天大约有 10K 条记录被添加到索引中 dev-answer
。
我想触发删除操作(这可以每天或每周一次或每月一次触发),如果满足特定条件,这将基本上删除 index
以上的所有文档。 (我会在 DeleteByQueryRequest
中给出)
对于删除,我指的是最新 doc 中给出的 api。
DeleteByQueryRequest request = new DeleteByQueryRequest("source1", "source2");
在阅读文档时,我遇到了以下我无法理解的问题。
如文档所示:It’s also possible to limit the number of processed documents by setting size. request.setSize(10);
processed document 是什么意思?它会只删除 10 个文件吗?
我应该设置多少批量大小? request.setBatchSize(100);
它的性能取决于我们要删除多少文档?
我应该先打电话给 get no of documents
并据此更改 setBatchSize
吗?
request.setSlices(2);
切片应该取决于执行器机器有多少核或弹性集群中没有核?
在文档中给出了方法 setSlices(2)
,我在 class org.elasticsearch.index.reindex.DeleteByQueryRequest
中找不到。我在这里缺少什么?
让我们考虑一下如果我在异步模式下执行这个删除查询需要 0.5-1.0 秒,同时如果我在这个索引上做 get 请求,它会给出一些异常吗?
同样在同一时间,如果我插入新文档并检索相同的文档,它是否能够给出响应?
1。如在 doc 中:也可以通过设置大小来限制处理文档的数量。 request.setSize(10); processed document 是什么意思?它会只删除 10 个文档吗?
如果您还没有,您应该阅读 search/_scroll
文档。 _delete_by_query
使用作为参数给出的查询执行滚动搜索。
size
参数对应于每次调用 scroll
端点返回的文档数。如果您有 10 个文档匹配您的查询且大小为 2,elasticsearch 将在内部执行 5 search/_scroll
次调用(即 5 个批次),而如果您将大小设置为 5,则只会执行 2 search/_scroll
次调用执行。
无论 size
参数如何 所有 匹配查询的文档都将被删除,但效率会或多或少。
2。我应该设置什么批量大小? request.setBatchSize(100);它的性能取决于我们要删除多少文档?
setBatchSize()
方法相当于在查询中设置size
参数。您可以阅读 this article 以确定大小参数的正确值。
3。我是否应该先打电话以获取没有文档并根据该 setBatchSize 进行更改?
您必须 运行 两次搜索请求才能获得已删除文档的数量,我相信这样效率不高。我建议你找到并坚持一个常数值。
4。切片应该取决于执行器机器有多少个内核或弹性集群中没有内核?
slice 的数量应该从 elasticsearch 集群配置中设置。它还可以并行化分片之间和分片内的搜索。
您可以阅读 the documentation 以获取有关如何设置此参数的提示。通常是您的索引的分片数。
5。在文档中给出了方法 setSlices(2),我无法在 class org.elasticsearch.index.reindex.DeleteByQueryRequest 中找到它。我在这里缺少什么?
你是对的,这可能是文档中的一个错误。我从未尝试过,但我相信你应该使用 forSlice(TaskId slicingTask, SearchRequest slice, int totalSlices)
.
6。让我们考虑一下我是否在异步模式下执行这个删除查询,这需要 0.5-1.0 秒,同时如果我在这个索引上做 get 请求,它会给出一些异常吗?同时如果我插入新文档并检索相同的文档,它是否能够给出响应?
首先,如文档中所述,_delete_by_query
端点创建索引快照并处理此副本。
对于get
请求,这取决于文档是否已经被删除。它永远不会发送异常,如果您在哪里检索现有或不存在的文档,您只会得到相同的结果。请注意,除非您在搜索查询中指定 sort
,否则不会确定文档的删除顺序。
如果您在处理过程中插入(或更新)文档,_delete_by_query
端点将不会考虑该文档,即使它与 _delete_by_query
查询匹配。这是使用快照的地方。因此,如果您插入一个新文档,您将能够检索它。如果您更新现有文档,则相同,如果文档已被删除或更新,则将重新创建该文档,但如果尚未删除,则不会删除。
附带说明,在 refresh
操作发生之前,删除的文档仍然可以搜索(即使在 delete_by_query
任务完成后)。
_delete_by_query
不支持 refresh
参数。 refresh
操作文档中提到的 request return
是指可以具有刷新参数的请求。如果你想强制刷新,你可以使用 _refresh
端点。默认情况下,刷新操作每 1 秒发生一次。因此,一旦 _delete_by_query
操作在最多 1 秒后完成,将无法搜索已删除的文档。
我想了解更多有关弹性删除的信息,它是 Java 高级删除 api & 天气执行批量删除是可行的。
配置信息如下
- Java: 8
- 弹性版本:7.1.1
已添加弹性依赖项:
<dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>7.1.1</version> </dependency> <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>7.1.1</version> </dependency>
在我的例子中,每天大约有 10K 条记录被添加到索引中 dev-answer
。
我想触发删除操作(这可以每天或每周一次或每月一次触发),如果满足特定条件,这将基本上删除 index
以上的所有文档。 (我会在 DeleteByQueryRequest
中给出)
对于删除,我指的是最新 doc 中给出的 api。
DeleteByQueryRequest request = new DeleteByQueryRequest("source1", "source2");
在阅读文档时,我遇到了以下我无法理解的问题。
如文档所示:
It’s also possible to limit the number of processed documents by setting size. request.setSize(10);
processed document 是什么意思?它会只删除 10 个文件吗?我应该设置多少批量大小?
request.setBatchSize(100);
它的性能取决于我们要删除多少文档?我应该先打电话给
get no of documents
并据此更改setBatchSize
吗?request.setSlices(2);
切片应该取决于执行器机器有多少核或弹性集群中没有核?在文档中给出了方法
setSlices(2)
,我在 classorg.elasticsearch.index.reindex.DeleteByQueryRequest
中找不到。我在这里缺少什么?让我们考虑一下如果我在异步模式下执行这个删除查询需要 0.5-1.0 秒,同时如果我在这个索引上做 get 请求,它会给出一些异常吗? 同样在同一时间,如果我插入新文档并检索相同的文档,它是否能够给出响应?
1。如在 doc 中:也可以通过设置大小来限制处理文档的数量。 request.setSize(10); processed document 是什么意思?它会只删除 10 个文档吗?
如果您还没有,您应该阅读 search/_scroll
文档。 _delete_by_query
使用作为参数给出的查询执行滚动搜索。
size
参数对应于每次调用 scroll
端点返回的文档数。如果您有 10 个文档匹配您的查询且大小为 2,elasticsearch 将在内部执行 5 search/_scroll
次调用(即 5 个批次),而如果您将大小设置为 5,则只会执行 2 search/_scroll
次调用执行。
无论 size
参数如何 所有 匹配查询的文档都将被删除,但效率会或多或少。
2。我应该设置什么批量大小? request.setBatchSize(100);它的性能取决于我们要删除多少文档?
setBatchSize()
方法相当于在查询中设置size
参数。您可以阅读 this article 以确定大小参数的正确值。
3。我是否应该先打电话以获取没有文档并根据该 setBatchSize 进行更改?
您必须 运行 两次搜索请求才能获得已删除文档的数量,我相信这样效率不高。我建议你找到并坚持一个常数值。
4。切片应该取决于执行器机器有多少个内核或弹性集群中没有内核?
slice 的数量应该从 elasticsearch 集群配置中设置。它还可以并行化分片之间和分片内的搜索。
您可以阅读 the documentation 以获取有关如何设置此参数的提示。通常是您的索引的分片数。
5。在文档中给出了方法 setSlices(2),我无法在 class org.elasticsearch.index.reindex.DeleteByQueryRequest 中找到它。我在这里缺少什么?
你是对的,这可能是文档中的一个错误。我从未尝试过,但我相信你应该使用 forSlice(TaskId slicingTask, SearchRequest slice, int totalSlices)
.
6。让我们考虑一下我是否在异步模式下执行这个删除查询,这需要 0.5-1.0 秒,同时如果我在这个索引上做 get 请求,它会给出一些异常吗?同时如果我插入新文档并检索相同的文档,它是否能够给出响应?
首先,如文档中所述,_delete_by_query
端点创建索引快照并处理此副本。
对于get
请求,这取决于文档是否已经被删除。它永远不会发送异常,如果您在哪里检索现有或不存在的文档,您只会得到相同的结果。请注意,除非您在搜索查询中指定 sort
,否则不会确定文档的删除顺序。
如果您在处理过程中插入(或更新)文档,_delete_by_query
端点将不会考虑该文档,即使它与 _delete_by_query
查询匹配。这是使用快照的地方。因此,如果您插入一个新文档,您将能够检索它。如果您更新现有文档,则相同,如果文档已被删除或更新,则将重新创建该文档,但如果尚未删除,则不会删除。
附带说明,在 refresh
操作发生之前,删除的文档仍然可以搜索(即使在 delete_by_query
任务完成后)。
_delete_by_query
不支持 refresh
参数。 refresh
操作文档中提到的 request return
是指可以具有刷新参数的请求。如果你想强制刷新,你可以使用 _refresh
端点。默认情况下,刷新操作每 1 秒发生一次。因此,一旦 _delete_by_query
操作在最多 1 秒后完成,将无法搜索已删除的文档。