搜索优化 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

相关文章
相关标签/搜索