介绍: 记录一下自己遇到的问题。
问题
我们用ElasticsearchRestTemplate操作Elasticsearch生成索引时,
//生成es索引
elasticsearchTemplate.indexOps(RecodeSearchWords.class).create();
当有时间字段 的时候,我们保存数据的时候Elasticsearch那边总是保存的是时间戳,即便我们在实体类字段上使用了注解
@Field(type = FieldType.Date, format = DateFormat.basic_date_time_no_millis)
private Date create_time;
但是好像并没有作用,结果和我们象限的不一致;
{
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "ssss",
"_type" : "_doc",
"_id" : "a8af8a03bfee4df787ba66a99372f894",
"_score" : 1.0,
"_source" : {
"_class" : "com.kikuu.search.pojo.RecodeSearchWords",
"words_id" : "a8af8a03bfee4df787ba66a99372f894",
"keywords" : "aa",
"clicknum" : 1,
"findcount" : 1,
"create_time" : "20210422T092505Z"
}
}
]
}
}
我们的create_time字段还被变成了字符类型,我们通过时间去分析数据就会变得很难。
手动设置create_time的类型,不用ElasticsearchRestTemplate去帮助我们生成
PUT /recode_user_words
{
"mappings": {
"create_time":{
"type": "date",
"format": "basic_date_time_no_millis"
}
}
}
format和值为basic_date_time_no_millis和我们代码注解的要一致的。
要选择哪一个,我们可以查看
Elasticsearch的默认时间为世界时间,所以保存的时间会和我们本地相差8小时
我们在保存数据的时候先添加8小时
Date date = new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.HOUR, 8);
date = cal.getTime()
问题解决
补充: 当我们通过logstash导入数据的时候也会发生时间相差8小时
参考文档