優化磁盤空間的佔用,減少磁盤空間的佔用,更多的數據可以進入filesystem cache
比如說你原來,磁盤空間佔用一共是1T,內存只有512G,現在優化了磁盤空間佔用之後,減少了數據量,可能數據量就只有512G了,那麼就可以全部進入內存
1、禁用不需要的功能
聚合,搜索,評分,近似匹配
聚合:doc values
搜索:倒排索引,index
評分:norms
近似匹配:index_options(freqs)
任何一個功能不需要,就把對應的存儲的數據給幹掉,這樣可以節約磁盤空間的佔用,也可以優化磁盤的讀寫性能
默認情況下,es在寫入document到索引的時候,都會給大多數的field增加一份doc values,就是正排索引,用來進行聚合或者排序的。比如說,如果我們有一個叫做foo的數字類型field,我們要對這個字段運行histograms aggr聚合操作,但是可能我們並不需要對這個字段進行搜索,那麼就可以禁止爲這個字段生成倒排索引,只需要doc value正排索引即可。禁用倒排索引:
PUT index
{
"mappings": {
"type": {
"properties": {
"foo": {
"type": "integer",
"index": false
}
}
}
}
}
text類型的field會存儲norm值,用來計算doc的相關度分數,如果我們需要對一個text field進行搜索,但是不關心這個field的分數,那麼可以禁用norm值
PUT index
{
"mappings": {
"type": {
"properties": {
"foo": {
"type": "text",
"norms": false
}
}
}
}
}
text field還會存儲出現頻率以及位置,出現頻率也是用來計算相關度分數的,位置是用來進行phrase query這種近似匹配操作的,如果我們不需要執行phrase query近似匹配,那麼可以禁用位置這個屬性:
PUT index
{
"mappings": {
"type": {
"properties": {
"foo": {
"type": "text",
"index_options": "freqs"
}
}
}
}
}
此外,如果我們不關心相關度頻分,我們可以配置es僅僅爲每個term索引對應的document,我們可以對這個field進行搜索,但是phrase query這種近似匹配會報錯,而且相關度評分會不準確:
PUT index
{
"mappings": {
"type": {
"properties": {
"foo": {
"type": "text",
"norms": false,
"index_options": "freqs"
}
}
}
}
}
2、不要用默認的動態string類型映射
默認的動態string類型映射會將string類型的field同時映射爲text類型以及keyword類型,這會浪費磁盤空間,因爲我們不一定兩種都需要。通常來說,id field這種字段可能只需要keyword映射,而body field可能只需要text field。
映射一個content,content: text,content.內置字段: keyword
可以通過手動設置mappings映射來避免字符串類型的field被自動映射爲text和keyword:
PUT index
{
"mappings": {
"type": {
"dynamic_templates": [
{
"strings": {
"match_mapping_type": "string",
"mapping": {
"type": "keyword"
}
}
}
]
}
}
}
3、禁止_all field
_all field會將document中所有field的值都合併在一起進行索引,很耗費空空間,如果不需要一次性對所有的field都進行搜索,那麼最好禁用_all field。
4、使用best_compression
_source field和其他field都很耗費磁盤空間,最好是對其使用best_compression進行壓縮。用elasticsearch.yml中的index.codec來設置,將其設置爲best_compression即可。
5、用最小的最合適的數字類型
es支持4種數字類型,byte,short,integer,long。如果最小的類型就合適,那麼就用最小的類型。