让我们考虑以下情况 - “article”文档中有两个字段 - content(string) 和 views(int)。 views 字段没有索引。 views 字段包含这篇文章被阅读了多少次的信息。
We also said that documents are immutable: they cannot be changed, only replaced. The update API must obey the same rules. Externally, it appears as though we are partially updating a document in place. Internally, however, the update API simply manages the same retrieve-change-reindex process that we have already described.
但是如果我们对未索引的字段进行局部更新会怎样——elasticsearch 会重新索引整个文档吗?例如 - 我想在每次有人阅读某篇文章时更新 View 。如果重新索引整个文档,我将无法进行实时更新(因为操作量太大)。因此,我将不得不延迟工作,例如,每 3-5-10 分钟更新一次访问者阅读过的所有文章。还是我理解有误?
最佳答案
但是如果我们对未索引的字段进行局部更新会怎么样 - elasticsearch 会重新索引整个文档吗?
是的,虽然 views
字段没有单独索引,但它是 _source
字段的一部分。 _source
字段包含您在为文档建立索引时发送给 Elasticsearch 的原始 JSON,如果在搜索过程中与文档匹配,则会在结果中返回。 _source
字段使用 Lucene 中的文档进行索引。在您的更新脚本中,您正在更改 _source
字段,以便重新索引整个文档。
您能否评估以下策略。每次有人阅读我的文章时,我都会向 elastic 发送更新。但是 refresh_interval 我设置为 30 秒。如果在 30 秒的时间间隔内大约有 1000 名用户阅读了一篇文章,这种策略是否正常?
您仍在索引 1000 个文档,1 个文档将被索引为当前文档,999 个文档将被标记为已删除并在下一次 Lucene 合并期间从索引中删除。
关于java - 未索引字段的部分更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28937946/