【问题标题】:ElasticSearch search sometime fails to search a documentElasticSearch 搜索有时无法搜索文档
【发布时间】:2019-07-01 06:48:17
【问题描述】:

我对 ElasticSearch 还是很陌生。我们已经建立了一个具有 5 个分片的 ElasticSearch 节点,默认配置为 ElasticSearch。所有都是没有复制的主分片。

我们在 ElasticSearch 中存储的用户相关信息很少。在其中一个用例中,如果 Elastic 中存在具有该手机号码的任何用户,我会检查弹性搜索,如果存在,我会将链接的用户或索引更新为新文档。

在某些情况下,我会收到很多针对同一用户的重复索引请求,并且此逻辑失败。它适用于大多数情况,但有时会失败。我无法深入了解这个问题

从我从文档中了解到,如果涉及副本分片,则存在写入一致性,但就我而言,目前还没有副本分片。此外,在搜索期间,elastic 会向所有分片发出请求,因此最终您应该会获得该文档。

我真的不明白为什么它会失败。任何帮助将不胜感激。

【问题讨论】:

  • 那么问题是什么,它会导致重复记录吗?您想避免这种情况吗??
  • @AmitKhandelwal - 是的,这是主要问题
  • 请参考stackoverflow.com/questions/56840637/…,如果您发现任何此类错误,请告诉我

标签: elasticsearch


【解决方案1】:

这可能是由于refresh 设置造成的。当您在默认情况下对文档进行索引时,它不能直接用于搜索,必须先进行刷新操作。

也许你处于以下场景:

  1. 搜索用户 X
  2. 不匹配 => 索引用户 X
  3. 搜索用户 X
  4. 仍然不匹配,因为尚未发生刷新 => 再次索引用户 X
  5. 刷新

默认情况下,刷新操作每 1 秒发生一次,因此如果在不到 1 秒的时间内发生两次对同一用户的搜索,您很可能会对该文档进行两次索引。

如何避免这个问题?

如果可以为文档生成id,可以在更新api中使用doc_as_upsert参数。如果文档不存在则创建文档,否则更新。

否则你可以在每次搜索之前force a refresh的索引。不建议这样做,因为刷新操作很繁重,但它可以让您确保这是问题的原因。

请注意,您仍然必须使用一些内部同步机制,因为索引操作可能发生在force refresh 操作和搜索操作之间。例如,请参见以下场景:

  1. 线程 1:刷新并搜索文档 X => 没有结果
  2. 线程 2:索引文档 X
  3. 线程 1:搜索和索引文档 X,因为没有结果

删除重复文件

如果您接受在短时间内有一些重复的文件,您可以使用以下解决方案。

每次索引新文档时,都会在数据结构中保存以下信息:

  • 索引请求的时间
  • 新索引文档的id
  • 用于检查文档是否唯一的搜索查询
  • 一个标志,用于指示是否已再次搜索初始化为 false 的条目

您必须在每次刷新操作后(默认为每秒)运行以下测试:

Foreach entry in the datastructure
  If indexationTime > now - refresh delay AND NOT entry.flag 
    // The indexed document corresponding to the entry is searchable
    entry.flag = true 
    // Avoid running the search another time
    Rerun the corresponding search query considering only the ids in the datastructure to speed up search.
    If there is multiple response, remove the duplicates 

要仅搜索一组选定的 id,您可以使用 ids query

您还必须从数据结构中删除可以安全丢弃的条目。这是将标志设置为true 的条目,并且在indexationTime + refreshDuration 之前索引的所有其他其他条目也将其标志设置为true

【讨论】:

  • 谢谢皮埃尔。将评估这些选项
  • 嗨@皮埃尔。你是对的,我得到了很多点击,而这次更新正在制造一个问题。不幸的是,我当时没有 id,因为如果存在记录,我正在通过 mobileNumber 和其他一些属性进行检查。刷新将是一项昂贵的操作。
  • 不幸的是,如果您不能使用刷新和生成的 ID,我知道没有简单的解决方案。我已经使用可以有效删除重复文件的解决方案更新了响应,但您仍然会在短时间内拥有重复的文档。
  • Pierre-我认为更好的方法是根据我用于搜索的属性生成 id。现在我正在使用自动生成的 id。
  • 好的,如果你能得到唯一的id,你可能想看看doc_as_upsert,它可以完美地解决你的问题。
猜你喜欢
  • 2022-08-12
  • 2021-05-20
  • 2014-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-21
  • 1970-01-01
相关资源
最近更新 更多