搜索優化 Elasticsearch 基於時間的索引

背景:

搜索接口性能慢,數據量大html

業務背景:有1000家公司,不一樣公司數據量差別大,且越近的時間的數據使用到的機率越大。app

方案一:按公司建索引,每家公司一個索引

有點:技術實現簡單。curl

缺點:一、出故障重建索引效率慢。二、可擴展性不強elasticsearch

方案二: 熱點數據單獨索引,歷史數據按時間進行索引

經常使用數據切分方案參考:Sizing Elasticsearch ide

下面重點介紹下「基於時間的索引」 (time-based indices) 的相關技巧性能

一、如何選擇劃分的時間範圍ui

根據數據的增加速度不一樣 能夠按天(索引名相似2019-09-24),按月(索引名相似2019-09),按年(索引名相似2019)進行劃分url

二、設計一個索引模板spa

對於咱們業務來講,其實每一個索引除了索引名稱不一樣之外,其餘的都是同樣的,因此咱們能夠設計一個模板,用於每次索引的建立。這裏須要用到就 ES 的 Index Templates 機制。設計

Index Templates 的基本原理是:首先預約義一個或多個 「索引模板」(index template,其中包括 settings 和 mappings 配置);而後在建立索引時,一旦索引名稱匹配了某個 「索引模板」,ES 就會自動將該 「索引模板」 包含的配置(settings 和 mappings)應用到這個新建立的索引上面。

以業務爲例,假設咱們的 ES 索引需求以下:

按越索引(索引名稱形如 business-2019-09)

天天的數據按所屬的月份存入對應月份的索引

搜索的時候,但願搜索範圍是全部的索引(藉助 alias)

基於上述索引需求,對應的 「索引模板」 能夠設計爲:

$ curl -XPUT http://localhost:9200/_template/business_template -d'{

  "template": "business-*",

  "settings": {

    "number_of_shards": 1

  },

  "mappings": {

    "log": {

      "dynamic": false,

      "properties": {

        "content": {

          "type": "string"

        },

        "created_at": {

          "type": "date",

          "format": "dateOptionalTime"

        }

      }

    }

  },

  "aliases": {

    "search-business": {}

  }

}'

說明:

建立索引時,若是索引名稱的格式形如 「business-*」,ES 會自動將上述 settings 和 mappings 應用到該索引

aliases 的配置,告訴 ES 在每次建立索引時,自動爲該索引添加一個名爲 「search-business」 的 alias(別名)

索引與搜索

基於上述 「索引模板」 的設計,索引與搜索的策略就很直接了。

索引策略:天天的數據,只索引到當月對應的索引。好比,2019 年9 月 24 日這天的數據,只索引到 business-2019-09 這個索引當中。

搜索策略:由於搜索需求是但願全量搜索,因此在搜索的時候,索引名稱使用 「search-business」 這個 alias 便可。

更多關於 「如何有效管理基於時間的索引」 的技巧,能夠參考 Managing Elasticsearch time-based indices efficiently

相關文章
相關標籤/搜索