【问题标题】:Partial update on field that is not indexed未编入索引的字段的部分更新
【发布时间】:2015-05-10 08:52:12
【问题描述】:

让我们考虑以下情况 - “文章”文档中有两个字段 - content(string) 和 views(int)。视图字段未编入索引。 views 字段包含了这篇文章被阅读了多少次的信息。

From official doc:

我们还说文档是不可变的:它们无法更改, 只换了。更新 API 必须遵守相同的规则。对外,它 看起来好像我们正在部分更新文档。 然而,在内部,更新 API 只是管理相同的 我们已经描述了retrieve-change-reindex过程。

但是如果我们对未索引的字段进行部分更新怎么办 - elasticsearch 会重新索引整个文档吗?例如 - 我想在每次有人阅读文章时更新视图。如果重新索引整个文档,我将无法进行实时更新(因为操作太繁重)。所以我将不得不延迟工作,例如每 3-5-10 分钟更新访问者阅读的所有文章。还是我理解错了?

【问题讨论】:

    标签: java elasticsearch


    【解决方案1】:

    但是如果我们对未索引的字段进行部分更新怎么办 - elasticsearch 会重新索引整个文档吗?

    是的,虽然views 字段没有单独索引,但它是_source 字段的一部分。 _source 字段包含您在为文档编制索引时发送到 Elasticsearch 的原始 JSON,如果在搜索期间文档上存在匹配项,则会在结果中返回。 _source 字段使用 Lucene 中的文档进行索引。在您的更新脚本中,您将更改 _source 字段,以便重新索引整个文档。

    您能否评估以下策略。每次有人阅读这篇文章时,我都会向弹性发送更新。但是 refresh_interval 我设置为 30 秒。如果在 30 秒的时间间隔内有大约 1000 名用户阅读了一篇文章,这种策略是否正常?

    您仍在为 1000 个文档编制索引,1 个文档将被索引为当前文档,999 个文档将被索引标记为已删除,并在下一次 Lucene 合并期间从索引中删除。

    【讨论】:

    • 感谢您的帮助。然后,您能否评估以下策略。每次有人阅读这篇文章时,我都会向弹性发送更新。但是 refresh_interval 我设置为 30 秒。如果在 30 秒的时间间隔内有大约 1000 名用户阅读了一篇文章,这种策略是否正常?问题是我不想编写db和elasticsearch之间的同步机制。
    • 这个很重要,所以说详细点。我有 id=12 的文章。在 30 秒的间隔内,有 1000 名访问者阅读了这篇文章。如果我向弹性发送 1000 次更新,然后将进行索引刷新,弹性会做什么:a)它将更新文档和索引 1000 次 b)它将更新 999 次并且只考虑队列中的最后一次更新?
    猜你喜欢
    • 1970-01-01
    • 2013-03-01
    • 2017-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-26
    • 2020-09-29
    相关资源
    最近更新 更多