Elasticsearch7解决时间字段总是保存时间戳问题

介绍: 记录一下自己遇到的问题。

问题

我们用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()

1619085072791

问题解决

补充: 当我们通过logstash导入数据的时候也会发生时间相差8小时

参考文档

# 架构 

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×