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);
    }
}

猜你喜欢

转载自blog.csdn.net/Maxiao1204/article/details/121402769