Ash*_*inK 7 elasticsearch java-8 elasticsearch-java-api
我想了解更多有关弹性删除的信息,它是 Java 高级删除 api 和天气,可以执行批量删除。
以下是配置信息
添加了弹性依赖项:
<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>
Run Code Online (Sandbox Code Playgroud)在我的情况下,每天大约有 10K 条记录被添加到索引中dev-answer。我想触发删除操作(这可以每天或每周或每月触发一次),index如果满足特定条件,它将基本上删除上面的所有文件。(我会放弃DeleteByQueryRequest)
对于删除,我指的是最新文档中给出的 api 。
DeleteByQueryRequest request = new DeleteByQueryRequest("source1", "source2");
Run Code Online (Sandbox Code Playgroud)
在阅读文档时,我遇到了以下我无法理解的查询。
如文档中所示:It’s also possible to limit the number of processed documents by setting size. request.setSize(10);
处理的文档是什么意思?它会只删除 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 请求,它会给出一些异常吗?同样在同一时间,如果我插入新文档并检索相同的文档,它是否能够给出响应?
如果你还没有,你应该阅读search/_scroll文档。_delete_by_query使用作为参数给出的查询执行滚动搜索。
该size参数对应于每次调用scroll端点返回的文档数。如果您有 10 个文档与您的查询匹配且大小为 2,则 elasticsearch 将在内部执行 5 次search/_scroll调用(即 5 个批次),而如果您将大小设置为 5,则只会search/_scroll执行2 次调用。
无论size参数如何,与查询匹配的所有文档都将被删除,但效率会或多或少。
setBatchSize()方法相当于size在查询中设置参数。您可以阅读这篇文章来确定 size 参数的正确值。
您必须运行两次搜索请求才能获取已删除文档的数量,我相信这不会有效率。我建议你找到并坚持一个恒定的值。
切片数量应从 elasticsearch 集群配置中设置。它还可以并行化分片之间和分片内的搜索。
您可以阅读文档以获取有关如何设置此参数的提示。通常是索引的分片数。
您是对的,这可能是文档中的错误。我从未尝试过,但我相信您应该使用forSlice(TaskId slicingTask, SearchRequest slice, int totalSlices).
首先,如文档中所述,_delete_by_query端点创建索引的快照并处理此副本。
对于get请求,取决于文档是否已被删除。它永远不会发送异常,如果您检索现有或不存在的文档,您将获得相同的结果。请注意,除非您sort在搜索查询中指定 a,否则不会确定文档的删除顺序。
如果在处理过程中插入(或更新)一个文档,则_delete_by_query端点不会考虑该文档,即使它与_delete_by_query查询匹配。这是使用快照的地方。因此,如果您插入一个新文档,您将能够检索它。同样,如果您更新现有文档,则如果该文档已被删除或更新,则将再次创建该文档,如果尚未删除,则不会删除。
附带说明一下,delete_by_query在refresh操作发生之前,已删除的文档仍然可以搜索(即使在任务完成后)。
_delete_by_query不支持refresh参数。在request return该文档中mentionnedrefresh操作指的是可以有一个刷新参数的请求。如果要强制刷新,可以使用_refresh端点。默认情况下,刷新操作每 1 秒发生一次。所以一旦_delete_by_query操作在最多 1 秒后完成,删除的文档将无法搜索。