带和不带_all的elasticsearch索引大小

elasticsearch index size with and without _all

有没有办法找到索引中各个字段占用的大小?

我有 10 个字段,_source 被禁用。我没有字段的映射。

启用 _all 后磁盘上的索引大小为 95 mb

没有 _all(禁用),磁盘上的索引大小为 70 mb

我的理解是_all 存储所有字段的副本。那么 _all 的索引大小不会加倍吗?为什么差异只是 15 mb 而不是 47mb?

谢谢

_all 不是所有字段的副本;它只是另一个存储所有其他字段值的字段。

假设我们在索引中只有三个文档(d1d2d3),只有两个字段 f1f2。见下文:

d1
{
    "f1": "v1",
    "f2": "v2"
},    
d2
{
    "f1": "v2",
    "f2": "v2"
},
d3
{
    "f1": "v1",
    "f2": "v1"
}

现在 Lucene 会将这些数据存储在倒排索引中,如下所示。

字段 f1 的反向索引:

"v1" -> "d1", "d3"
"v2" -> "d2"

字段 f2 的反向索引:

"v1" -> "d3",
"v2" -> "d1", "d2"

启用_all后,_all字段会有一个额外的倒排索引。

字段 _all 的反向索引:

"v1" -> "d1", "d3"
"v2" -> "d1", "d2"

您可以清楚地看到,没有 _all 的发布列表大小是 6 个文档,而带有 _all 的发布列表大小是 10 个文档而不是 12 个文档。

这只是一个简单的例子来证明启用_all并不意味着索引大小会简单地加倍。

除了 bsarkar 的出色回答之外,_all 是一个仅索引字段(默认情况下,无论如何)。也就是说,它不被存储。存储和索引字段,可以是既可以搜索又可以用搜索结果检索的任何字段,必须构建倒排索引,并且还必须以原始形式存储以便以后检索。存储整个字段内容会占用大量存储空间。