elasticsearch的索引優化

建立合適的索引不只能夠節約存儲資源, 還能夠優化咱們的查詢,減小內存的使用。sql

存儲優化方式以下:json

去除多餘的字段

每個字段都會佔用硬盤資源,越少字段的索引,數據佔用的存儲空間就少。文檔量少也許還看不出效果,當文檔量幾億的時候,節約的硬盤空間仍是很客觀的。app

儘可能type不用text類型

text類型的字段相比與keyword,date,long等佔用更多的存儲空間不說,查詢,排序,聚合都沒有其餘類型高效。因此在不使用分詞效果的時候,字段儘可能使用其餘類型。curl

type爲text的字段優化

1. norms

會消耗許多磁盤空間,來計算在一個字段上,文檔的相關性(_scoring)。若是該字段只是用來filtering或者聚合(aggregation) ,就能夠設置爲false。elasticsearch

2. fielddata

要用到聚合的text字段,必須把fielddata設置爲true. 排序或者聚合的時候,fielddata會把全部內容加載到內存,一旦分析字符串被加載到 fielddata ,他們會一直在那裏,直到被驅逐(或者節點崩潰),因此會比較消耗內存。優化手段以下:優化

  • fielddata_frequency_filter:過濾部份內容,減小內存的使用
    • min: 至少在本段文檔中出現超過 百分之多少 的項纔會被加載到內存中
    • max: 最多在本段文檔中出現超過 百分之多少 的項纔會被加載到內存中
    • min_segment_size: 忽略某個大小如下的段。 若是一個段內只有少許文檔,它的詞頻會很是粗略沒有任何意義。 小的分段會很快被合併到更大的分段中,某一刻超過這個限制,將會被歸入計算。
  • 配置文件(elasticsearch.yml)中增長配置
    • indices.fielddata.cache.size: 20%  //最多使用使用20%的內存來存儲fielddata。會用到LRU爲新數據提供空間
    • indices.breaker.fielddata.limit:40%  // fielddata 大小是在數據加載 以後 檢查的。若是一個查詢試圖加載到 fielddata的信息超過內存的40%,就會 觸發 斷路器,查詢會被停止並返回異常。

一個索引的例子

curl -XPUT 'localhost:9200/index-test' -H 'Content-Type: application/json' -d'
{
  "mappings": {
    "doc": {
      "properties": {
        "sql": {
          "type": "text",
          "fielddata": true,
          "fielddata_frequency_filter": {
            "min": 0.01,
            "min_segment_size": 300
          },
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "lock_time": {
          "type": "double"
        },
        "rows_sent": {
          "type": "long"
        },
        "host": {
          "type": "text",
          "norms": false
        },
        "time_local": {
          "type": "date"
        },
        "user": {
          "type": "keyword"
        }
      }
    }
  }
}
'
相關文章
相關標籤/搜索