字段为Doc_Values以删除内存使用情况

时间:2015-01-12 14:54:29

标签: caching elasticsearch

目前我们面临很多例外情况:

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值,索引会变大,有没有办法计算这个增加量?

1 个答案:

答案 0 :(得分:0)

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经常不会绊倒。< / p>

  • 为了表现......索引的减少非常轻微,没什么可担心的。

  • 在我们的情况下,索引大小现在大约增加了20%。