对未编制索引的字段进行部分更新

让我们考虑以下情况 – “文章”文档中有两个字段 – 内容(字符串)和视图(int)。 视图字段未编入索引。 views字段包含读取本文的次数。

来自官方文件 :

我们还说文件是不可变的:它们不能改变,只能被替换。 更新API必须遵守相同的规则。 在外部,似乎我们正在部分更新文档。 但是,在内部,更新API只管理我们已经描述的相同的retrieve-change-reindex进程。

但是,如果我们对非索引字段进行特定更新,那会怎么样?elasticsearch会重新索引整个文档吗? 例如 – 我想在每次有人阅读某篇文章时更新视图。 如果整个文档被重新编制索引,我无法进行实时更新(因为操作过于繁重)。 因此,我将不得不延迟工作,例如更新访问者每3-5-10分钟阅读的所有文章。 或者我明白了什么问题?

但是,如果我们对非索引字段进行特定更新,那会怎么样?elasticsearch会重新索引整个文档吗?

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

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

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