ElasticSearch 索引大小减少,而 docs.count 增加

ElasticSearch index size decreases while docs.count increases

我注意到 ElasticSearch(版本 5.5.0)中的一个奇怪行为,其中 store.size 减少而 docs.count 增加。为什么会这样?

$ curl 'localhost:9201/_cat/indices/index-name:2017-08-08?bytes=b&v'
health status index                 uuid                   pri rep docs.count docs.deleted store.size pri.store.size
green  open   index-name:2017-08-08 PlpLYu5vTN-HFA_ygHUNwg  17   1    5577181       212434 3827072602     1939889776

$ curl 'localhost:9201/_cat/indices/index-name:2017-08-08?bytes=b&v'
health status index                 uuid                   pri rep docs.count docs.deleted store.size pri.store.size
green  open   index-name:2017-08-08 PlpLYu5vTN-HFA_ygHUNwg  17   1    5581202       204815 3812410150     1927833617

请注意,虽然 docs.count 从 5577181->5581202 增加,但 store.size 和 pri.store.size 都减少了。

作为背景,我正在尝试使用索引大小来限制进入 ES 的数据(即每天 xGB)。但是,我注意到当我继续编制索引时,索引大小会定期减小(每隔一小时或几分钟左右)。这不是节流的好方法,因为存储大小没有严格增加

1) 知道为什么索引大小会减小吗? 2) 我应该使用严格递增的另一种尺寸吗?

编辑: 实际上,即使没有删除文档,文档计数仍然会减少。见下文

$ curl -s localhost:9200/_cat/indices | grep name green open index-name:2017-08-11
eIGiDgeZQ5CqSu3tAaLRgw 1 1 111717 0 210.4mb 109.5mb $ curl -s localhost:9200/_cat/indices | grep name green open index-name:2017-08-11
eIGiDgeZQ5CqSu3tAaLRgw 1 1 132329 0 204.7mb 103.2mb

所以你有 4021 个额外的文件 (=5581202-5577181) 但你也可以注意到删除的文件数量 docs.deleted 也减少了 7619 个文件 (=212434-204815) 所以净数量索引中的文档是 -3598。这是由于引擎盖下的 Lucene merging segments 为了清理已删除的文档并尝试重新获得一些未使用的 space.

这是整体索引大小减少 14662452 字节(~14 MB)的最可能原因

如果你想节流,你可以使用 docs.count 代替,如果你经常索引,这个数字应该增加。

Elasticsearch 集群会随着时间的推移压缩索引 - 因此 _stats api 操作可能会显示索引大小正在缩小(直到停止)。对于类似的文档,索引甚至可能被压缩 40%。

编辑:如上所述,只要文档被索引,引擎盖下的段合并就会随着时间的推移而发生。在每个段合并之后,它似乎(模糊地)在新段上发生了压缩,因此假设 ES compression algo is a Linear Transformation then compress(A) + compress(B) >= compress(A+B) 意味着索引大小可能会减小。