Elasticsearch 之索引创建原则

ES索引的创建不能很随便,因为很多情况下不只ES一个人在作战,大多数是和kibana一起使用,而kibana的一个很大的作用就是统计,比如可以做统计报表,统计记录等各种统计操作,而要做统计,就需要创建index pattern,如下图(基于es7.6):

然后创建index pattern:

 可以看到我随便输入一个pattern 名字,这里并没有匹配到任何index,这时候是不能创建这个pattern的,创建的pattern必须要能匹配相关的index才可以继续下一步 

这个index pattern创建的好坏直接取决于在写入es的时候索引的形式是否规范,一个好的index pattern可以能够很好的匹配到响应的数据,进而能很好的更准确的做统计

所以一般我们会创建一个基类:

public class BaseDoc {

    @JsonIgnore
    private String index;
    @JsonIgnore
    private String type;
    @JsonIgnore
    private String id;
    @JsonIgnore
    private String routing;
    @JsonIgnore
    private Long version;
    
    private Date creationDate;
    
    @JsonIgnore
    private IndexingStrategyEnum indexingStrategy;
    
}
IndexingStrategyEnum:
public enum IndexingStrategyEnum {

    WEEKLY("WEEKLY"),
    MONTHLY("MONTHLY"),
    QUARTERLY("QUARTERLY"),
    ANNUAL("ANNUAL");

    private String keyword;
    
    private static final String DECIMAL_FORMAT_PATTERN = "00";
    private static final String CONST_UNDERSCORE = "_";

    private IndexingStrategyEnum(String keyword) {
        this.keyword = keyword;
    }

    
    public String getIndexSuffix(Date date) {

        StringBuilder finalIndexName = new StringBuilder(CONST_UNDERSCORE);
        
        DateTime indexedDateTime = new DateTime(date.getTime());
        DecimalFormat formatter = new DecimalFormat(DECIMAL_FORMAT_PATTERN);

        switch (this) {

            case WEEKLY:
                finalIndexName.append(this.name().toLowerCase()).append(CONST_UNDERSCORE).append(indexedDateTime.getYear()).append(formatter.format(indexedDateTime.getWeekOfWeekyear()));
                break;

            case MONTHLY:
                finalIndexName.append(this.name().toLowerCase()).append(CONST_UNDERSCORE).append(indexedDateTime.getYear()).append(formatter.format(indexedDateTime.getMonthOfYear()));
                break;

            case QUARTERLY:
                finalIndexName.append(this.name().toLowerCase()).append(CONST_UNDERSCORE).append(indexedDateTime.getYear()).append(formatter.format((indexedDateTime.getMonthOfYear()-1)/3+1));
                break;

            case ANNUAL:
                finalIndexName.append(this.name().toLowerCase()).append(CONST_UNDERSCORE).append(indexedDateTime.getYear());
                break;

            default:
                break;
        }

        return finalIndexName.toString();
    }

}

然后我们在基类的基础上创建自己的索引规范,任何进入ES的data都要继承这个规范就可以对索引进行有效的规范化管理了:

public class MyEsData extends BaseDoc {

    private static final String DATA_INDEX = "data_index";
    private static final String DATA_TYPE = "datatype";

    public MyEsData (){
        this.setCreationDate(new Date());
        this.setIndex(DATA_INDEX +"_xxxx");
        this.setType(DATA_TYPE);
        this.setIndexingStrategy(IndexingStrategyEnum.WEEKLY);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Micrle_007

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值