为什么我在弹性搜索中看到已删除的文档

时间:2018-02-02 00:22:08

标签: elasticsearch lucene

我有弹性搜索群集,我总是使用doc_as_upsert Update api。 我从不打电话给DeleteApi。 但是如果我在弹性搜索中看到很多DeletedDocuments指标。 upsert是否间接调用delete然后插入?

1 个答案:

答案 0 :(得分:3)

ElasticSearch(ES)不支持文档更新,即文档是不可变的,我们无法更改它们。 Update API似乎可以更改文档,但实际上Elasticsearch会执行以下操作:

  1. 从旧文档中检索JSON
  2. 更改文档
  3. 删除旧文档
  4. 索引新文档
  5. 在内部,Lucene(ES是基于Lucene库的搜索引擎)只是在每段的位集中标记一点来记录文档被删除。所有后续搜索都会跳过任何已删除的文档这种方法是必要的,因为否则更新Lucene的一次写入索引数据结构(如发布列表)的成本太高。 您可以在this blog post

    中了解有关删除的更多信息

    说实话,Lucene支持就地更新,但这种方法只能用于更新单值非索引和非存储的基于docValue的数字字段,并且只能由Solr支持