登录
首页 >  Golang >  Go问答

文档中插入内容后无法立即移除?

来源:stackoverflow

时间:2024-03-25 18:21:32 112浏览 收藏

在 ElasticSearch 中,插入文档后存在一段时间,在此期间无法立即删除该文档。这是因为 Elasticsearch 操作可能不一致,需要一定时间来创建和维护用于搜索的数据结构,以及标记和擦除要删除的文档。

问题内容

我已经为 ElasticSearch 功能创建了一些测试,并且注意到了一些奇怪的行为。如果我有一个测试:

  1. 插入文档并确认没有错误
  2. 检索同一文档,确认没有错误并确认其具有预期值
  3. 删除文档,确认没有错误并确认已删除 1 个文档

那么第三次测试将失败,因为删除了 0 个文档。如果我采取以下步骤之一:

  • 调试测试并在插入之后、删除之前放置断点
  • 在删除步骤之前添加 time.Sleep(time.Second)

然后删除 1 个文档,第三次测试将通过。在第三次测试失败的情况下,我进入我的 ES 实例并确认该文档存在。

这让我相信,在插入文档后,在一段时间内必须发生一些事情,然后才能删除该文档。

我的问题是 - 插入后需要发生什么,以便我可以删除文档,对于我来说,在测试中处理这个问题是否有比休眠 1 秒更好的方法?

我正在使用 Golang 进行编码,并且正在使用 Olivere ES 客户端


正确答案


Elasticsearch 操作可能不一致。

您可以检查选项 refreshwait_for_active_shards 如果它适合您的测试。

注意:向不一致的系统添加测试总是很困难。

我不会使用术语 inconsistence。存储和检索文档是 real-time 操作。 search 正在 near-real-time 中进行。

虽然您始终可以搜索文档,但只有当用于搜索的数据结构(通常是倒排索引)存在时,它们才会进入您的结果集中。为每个被索引的文档创建和维护此数据结构将成本高昂且效率低下,这就是为什么最迟在刷新间隔到期(默认刷新间隔为 1 秒)时创建数据结构的原因。

此外,删除文档时,该文档不会立即从磁盘中删除。它首先被标记为删除,确保它不会再出现在任何结果中。但只有在一些 Elasticsearch 内部管理(段合并)之后,标记为删除的文档最终才会被擦除。

这应该会让您了解为什么对于搜索,我们谈论 near 实时 行为,或者您所描述的“间隙”

特别是对于单元/集成测试,您需要确保在索引文档后可以找到该文档。您可以通过添加参数 refresh=wait_for 将索引/写入请求转换为阻塞请求,轻松实现这一目标。这样,索引请求仅在创建搜索所需的数据结构之后返回。确保在您的下一个请求中,该文档可用于您想要执行的任何操作。

本篇关于《文档中插入内容后无法立即移除?》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>