暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

搜索优化 Elasticsearch 基于时间的索引

AlwaysBeCoding 2019-09-24
703


背景:

搜索接口性能慢,数据量大

业务背景:有1000家公司,不同公司数据量差异大,且越近的时间的数据使用到的概率越大。

方案一:按公司建索引,每家公司一个索引 有点:技术实现简单。

缺点:1、出故障重建索引效率慢。2、可扩展性不强

方案二: 热点数据单独索引,历史数据按时间进行索引 常用数据切分方案参考:Sizing Elasticsearch

下面重点介绍下“基于时间的索引” (time-based indices) 的相关技巧

1、如何选择划分的时间范围

根据数据的增长速度不同 可以按天(索引名类似2019-09-24),按月(索引名类似2019-09),按年(索引名类似2019)进行划分

2、设计一个索引模板

对于我们业务来说,其实每个索引除了索引名称不同以外,其他的都是一样的,所以我们可以设计一个模板,用于每次索引的创建。这里需要用到就 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": {}

}

}'

复制代码

说明:
  1. 创建索引时,如果索引名称的格式形如 “business-*”,ES 会自动将上述 settings 和 mappings 应用到该索引

  2. aliases 的配置,告诉 ES 在每次创建索引时,自动为该索引添加一个名为 “search-business” 的 alias(别名)

索引与搜索

基于上述 “索引模板” 的设计,索引与搜索的策略就很直接了。

索引策略:每天的数据,只索引到当月对应的索引。比如,2019 年9 月 24 日这天的数据,只索引到 business-2019-09 这个索引当中。

搜索策略:因为搜索需求是希望全量搜索,所以在搜索的时候,索引名称使用 “search-business” 这个 alias 即可。

更多关于 “如何有效管理基于时间的索引” 的技巧,可以参考 Managing Elasticsearch time-based indices efficiently



文章转载自AlwaysBeCoding,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论