小编典典

未索引字段的部分更新

elasticsearch

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

来自官方文档

我们还说过文件是不可变的:它们不能更改,只能替换。更新API必须遵守相同的规则。从外部看,似乎我们正在部分更新文档。但是,在内部,更新API仅管理与我们已经描述过的相同的检索-
更改-重新索引过程。

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


阅读 247

收藏
2020-06-22

共1个答案

小编典典

但是,如果我们对未索引字段进行部分更新该怎么办?Elasticsearch将为整个文档重新编制索引吗?

是的,虽然该views字段未单独索引,但它是该_source字段的一部分。该_source字段包含您在对文档建立索引时发送给Elasticsearch的原始JSON,并且如果在搜索过程中文档上存在匹配项,则返回结果。该_source字段在Lucene中的文档中建立了索引。在更新脚本中,您正在更改_source字段,因此整个文档将被重新编制索引。

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

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

2020-06-22