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