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