搜索接口性能慢,数据量大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