首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >弹性搜索delete_by_query是如何工作的?当我们插入新数据并在删除文档时检索相同的数据时会发生什么情况?

弹性搜索delete_by_query是如何工作的?当我们插入新数据并在删除文档时检索相同的数据时会发生什么情况?
EN

Stack Overflow用户
提问于 2019-07-05 09:30:09
回答 1查看 4.1K关注 0票数 7

我想了解更多关于弹性删除的知识,它是Java高级删除api &如果执行批量删除是可行的。

以下是配置信息

  • Java: 8
  • 弹性版本: 7.1.1
  • 增加了弹性依赖关系: org.elasticsearch.client elasticsearch -rest-高级客户端7.1.1 org.elasticsearch elasticsearch 7.1.1

在我的例子中,每天大约有10K记录被添加到索引dev-answer中。我想要触发删除操作(可以每天触发一次,或者一周一次,或者一个月一次),如果满足特定条件,基本上可以从上面的index中删除所有文档。(我将在DeleteByQueryRequest中给出)

对于delete,我指的是最新的文档中给出的api。

代码语言:javascript
运行
复制
DeleteByQueryRequest request = new DeleteByQueryRequest("source1", "source2");

在阅读文档时,我遇到了一些我无法理解的查询。

  1. 在doc:It’s also possible to limit the number of processed documents by setting size. request.setSize(10);中,处理文档意味着什么?会否只删除10份文件?
  2. 我应该设置什么批大小?request.setBatchSize(100);它的性能是基于我们要删除多少个文档? 我是否应该先打个电话给get no of documents &基于此,setBatchSize应该被更改?
  3. request.setSlices(2);切片应该取决于有多少核心执行器或没有在弹性机群中的核心?
  4. 在文档中,给出了在类setSlices(2)中找不到的方法org.elasticsearch.index.reindex.DeleteByQueryRequest。我在这里错过了什么?
  5. 让我们考虑一下,如果我在异步模式下执行这个delete查询,需要0.5秒-1.0秒,同时如果我对这个索引执行get请求,它会出现一些异常吗?同样在同一时间,如果我插入了新的文档&检索相同的文档,它能给出响应吗?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-05 11:10:26

1.与doc一样:也可以通过设置大小来限制已处理文档的数量。request.setSize(10);处理文档意味着什么?会否只删除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参数。您可以读取这篇文章来确定大小参数的正确值。

3.我是否应该先打个电话,不要得到任何文档&基于此,setBatchSize应该被更改?

你必须运行两次搜索请求才能得到被删除的文件的数量,我相信这是没有效率的。我建议你找到并坚持不变的价值。

4.切片应取决于弹性机群中有或没有芯芯执行器的数量?

片数应该从elasticsearch集群配置中设置。它还并行化了在碎片之间和碎片内部的搜索。

有关如何设置此参数的提示,您可以阅读文献资料。通常是索引的碎片数。

5.在文档中给出了在类org.elasticsearch.index.reindex.DeleteByQueryRequest.中找不到的setSlices(2)方法我在这里错过了什么?

您是对的,这可能是文档中的一个错误。我从未试过,但我相信你应该使用forSlice(TaskId slicingTask, SearchRequest slice, int totalSlices)

6.让我们考虑一下,如果我在异步模式下执行这个delete查询,需要0.5秒-1.0秒,同时如果我对这个索引执行get请求,它会出现一些异常吗?同样在同一时间,如果我插入了新的文档&检索相同的文档,它能给出响应吗?

首先,如文档中所述,_delete_by_query端点创建索引的快照并处理此副本。

对于get请求,这取决于文档是否已被删除。它永远不会发送异常,如果在哪里检索现有或不存在的文档,则只会得到相同的结果。请注意,除非在搜索查询中指定了sort,否则不会确定文档的删除顺序。

如果在处理过程中插入(或更新)文档,_delete_by_query端点将不考虑此文档,即使它与_delete_by_query查询匹配。这是使用快照的地方。因此,如果您插入一个新文档,您将能够检索它。同样,如果更新现有文档,则如果文档已被删除或更新,但如果尚未删除,则将再次创建该文档。

顺便指出,被删除的文档仍然可以搜索(即使在delete_by_query任务完成之后),直到发生refresh操作为止。

_delete_by_query不支持refresh参数。在refresh操作的文档中提到的refresh引用了可以具有刷新参数的请求。如果要强制刷新,可以使用_refresh端点。默认情况下,刷新操作每1秒进行一次。因此,一旦_delete_by_query操作在最多1秒后完成,被删除的文档将无法搜索。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56900317

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档