让我们考虑以下情况 - “文章”文档中有两个字段 - content(string) 和 views(int)。视图字段未编入索引。视图字段包含这篇文章被阅读了多少次的信息。
我们也说过文档是不可变的:它们不能被改变,只能被替换。更新 API 必须遵守相同的规则。从外部看,似乎我们正在对文档进行部分更新。然而,在内部,更新 API 只是管理我们已经描述过的相同的检索-更改-重新索引过程。
但是如果我们对未索引的字段进行部分更新怎么办 - elasticsearch 会重新索引整个文档吗?例如 - 我想在每次有人阅读文章时更新视图。如果整个文档被重新索引,我将无法进行实时更新(因为操作太繁重)。所以我将不得不延迟工作,例如更新访问者每 3-5-10 分钟阅读的所有文章。还是我理解错了?
但是如果我们对未索引的字段进行部分更新怎么办 - elasticsearch 会重新索引整个文档吗?
是的,虽然该views字段未单独编入索引,但它是该_source字段的一部分。该_source字段包含您在为文档编制索引时发送到 Elasticsearch 的原始 JSON,如果在搜索期间文档有匹配项,则会在结果中返回。该_source字段与 Lucene 中的文档一起索引。在您的更新脚本中,您正在更改_source字段,因此整个文档将被重新索引。
那么您能否评估以下策略。每次有人阅读文章时,我都会向弹性发送更新。但是我将 refresh_interval 设置为 30 秒。如果在 30 秒间隔内大约 1000 个用户阅读了一篇文章,这种策略是否正常?
您仍在索引 1000 个文档,1 个文档将被索引为当前文档,999 个文档将被索引标记为已删除并在下一次 Lucene 合并期间从索引中删除。