字段 Doc_Values 以减少内存使用

Fields as Doc_Values to drop Memory Usage

目前我们面临很多这样的异常:

ElasticsearchException[org.elasticsearch.common.breaker.CircuitBreakingException: Data too large, data for field [field1] would be larger than limit of [24108466176/22.4gb]]

在对上述异常进行一些调查后,field1 似乎占用了很多 fielddata cache size 以及我们称之为 field2

的另一个字段

GET /_stats/fielddata?fields=field1,field2的结果:

"total": {
         "fielddata": {
            "memory_size_in_bytes": 260456614595,
            "evictions": 1226307,
            "fields": {
               "field1": {
                  "memory_size_in_bytes": 76629429704
               },
               "field2": {
                  "memory_size_in_bytes": 97600838429
               }
            }
         }
      }

注意:两个字段都是not_analyzed。 Field1 在搜索查询中被大量使用,而 field2 则没有那么多。

因此,根据 es 文档的 doc value 部分,这些字段可以存储为 doc values 以减少堆使用。

这是解决上述异常等内存问题的好方法吗?

文档还说通过将字段存储为doc值,索引会变大,有没有办法计算这个增加?

Doc_Values太棒了!

  • 对于新索引,这些字段的 fielddata size 为 0:

    "total": {
       "fielddata": {
          "memory_size_in_bytes": 5394813851,
          "evictions": 112,
          "fields": {
             "field1": {
                "memory_size_in_bytes": 0
             }
          }
       }
    }
    
  • 在这些字段上执行查询时不再出现 Data too large 异常,更不用说这些查询现在执行得更快了,我猜是因为 CircuitBreaker 不会经常出错.

  • 为了性能...索引略有下降,不用担心。

  • 在我们的例子中,索引大小现在大约增加了 20%。