ElasticSearch Tune for disk usage Translation

  1. 云栖社区>
  2. 博客>
  3. 正文

ElasticSearch Tune for disk usage Translation

swinblacksea 2018-10-25 19:07:47 浏览1069
展开阅读全文
1.禁用不需要的属性
index:默认情况下,es会对大多数字段进行索引并添加doc值,以便可以直接索引和聚合它们,但是对于一个必须要使用的字段eg:你需要使用foo这个数值型字段展示直方图,那么这个字段永远不会被过滤掉,那么你可以安全地禁用映射中此字段的索引。

PUT index
{
  "mappings": {
    "_doc": {
      "properties": {
        "foo": {
          "type": "integer",
          "index": false
        }
      }
    }
  }
}
text:该属性在索引中存储了作为文档计分所需要的基本的因素,如果你索引的只是文本而不关注文本分数,那么你可以配置该索引不使用norms参数

PUT index
{
  "mappings": {
    "_doc": {
      "properties": {
        "foo": {
          "type": "text",
          "norms": false
        }
      }
    }
  }
}
text:默认情况下该属性还存储了frequencies和positions两个属性,第一个属性在积分系统中被使用到,第二个在短语查询中使用到。如果你不需要执行短语查询,那么你可以禁用positions属性

PUT index
{
  "mappings": {
    "_doc": {
      "properties": {
        "foo": {
          "type": "text",
          "index_options": "freqs"
        }
      }
    }
  }
}

另外,如果你不关心计分系统,你可以配置es在每个查询中仅仅索引文档。当然你也可以索引这个字段,但是短语查询将会报错并且计分系统会假定每次查询在每个文档中只会出现一次

PUT index
{
  "mappings": {
    "_doc": {
      "properties": {
        "foo": {
          "type": "text",
          "norms": false,
          "index_options": "freqs"
        }
      }
    }
  }
}

2.不要使用默认动态字符串映射
默认的动态字符串索引将字符串属性索引为文本和关键词,如果你只需要使用其中的一种这将会是很大的浪费,典型的id只需要被索引为关键字而body字段只需要被索引为文本属性。
可以通过在字符串上显式映射类型或者配置动态模板为文本或关键词来禁用上面的特性

PUT index
{
  "mappings": {
    "_doc": {
      "dynamic_templates": [
        {
          "strings": {
            "match_mapping_type": "string",
            "mapping": {
              "type": "keyword"
            }
          }
        }
      ]
    }
  }
}

3.关注你的分片大小
分片越大在存储数据的时候越高效,通过使用更少的分片数量来创建索引从而减少一个索引中的主分片数量来增大分片大小或者通过使用Sharking API来修改目前已经存在的索引
注意:巨大的分片大小会带来一定的缺点,例如需要很久的恢复时间

4.禁用_all
_all属性会索引一个文档中的所有字段值并且会使用巨大的空间。如果你不需要在同个时间索引所有字段,可以将_all属性禁用

5.禁用_source
_source存储文档的原始json数据,如果你不需要这些可以直接禁用了。然而,像update和reindex这种需要访问_source的APIs将不起作用

6.使用best_compression
_source和存储属性会很容易消耗掉不可忽视的磁盘空间。它们可以使用best_compression:codec 来进一步压缩空间

7.聚焦整合
es中的索引会被存储在一个或多个分片上。每一个分片就是一个Lucene索引并且有一个或多个片段组成,这些片段才是真正磁盘文件。越大的片段意味着越高效以及越能存储数据
_forcemerge API可以减少每个分片上的片段数量来增大每个片段的大小。在大多数情况下,每个分片的片段数量可以通过max_num_segments=1被设置为1

8.收缩索引
Shrink API帮助减少一个索引的分片数量。和上面的force_merge API一起使用可以显著地减少分片和片段的数量

9.在合适的情况下使用最小的数字类型
数值类型的类型选择将会在很大程度上影响磁盘使用率。具体地说,使用整值类型存储整数,在合适的情况下浮点数应该被存储在scaled_float中或更小的类型中。使用float而不是double,使用half_float而不是float将会帮助减少存储空间

10.使用索引排序来共置相同的文档
当es存储_source时,它会一次性压缩多个文档以提高整体压缩率。例如文档之间具有相同字段名称甚至字段值是很普遍的,特别是在基数较低或者遵循zipfian分布的情况下。
默认情况下,文档会被压缩在一起以便能够被添加到索引中,如果你提供索引排序那么它们会被有序压缩。有序并且结构,字段以及值都一样的文档会被压缩在一起以提高压缩率

11.文档字段保持相同的顺序
因为多个文档会被压缩到块中存储,如果字段遵循相同的顺序就更有可能在_source找到相同的长串。

网友评论

登录后评论
0/500
评论
swinblacksea
+ 关注