让我们考虑以下情况 - "文章" document - content(string)和views(int)。视图字段未编入索引。 views字段包含读取本文的次数。
我们还说文件是不可变的:它们不能改变, 只有更换。更新API必须遵守相同的规则。在外部,它 似乎我们正在部分更新文档。 但是,在内部,更新API只管理相同的内容 我们已经描述过的retrieve-change-reindex流程。
但是如果我们对非索引字段进行特别更新会怎么样 - elasticsearch会重新索引整个文档吗?例如 - 我想在每次有人阅读某篇文章时更新视图。如果整个文档被重新编制索引,我就无法进行实时更新(因为操作过于繁重)。所以我将不得不延迟工作,例如更新访问者每3-5-10分钟阅读的所有文章。或者我理解错了什么?
答案 0 :(得分:3)
但是,如果我们对非索引字段进行特别更新,那会怎么样?elasticsearch会重新索引整个文档吗?
是的,虽然views
字段未单独编入索引,但它是_source
字段的一部分。 _source
字段包含您在索引文档时发送给Elasticsearch的原始JSON,如果在搜索期间文档中存在匹配项,则会在结果中返回。 _source
字段使用Lucene中的文档编制索引。在更新脚本中,您正在更改_source
字段,以便重新编制整个文档的索引。
然后您可以评估以下策略。每次有人阅读文章我都会发送更新到弹性。但是,refresh_interval我设置为30秒。如果在30秒间隔内,大约1000名用户阅读过一篇文章,这种策略是否正常?
您仍在索引1000个文档,1个文档将被编入索引作为当前文档,999个文档将被编入索引标记为已删除并在下一个Lucene合并期间从索引中删除。