ElasticSearch Spring-Data Date格式总是很长

时间:2015-08-17 03:38:47

标签: java spring elasticsearch

当使用spring-data插入带有Date类型的Elasticsearch文档时,我无法获得正确的日期格式,日期格式始终为Long。

这是java代码:Entity.java

import java.util.Date;

import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.DateFormat;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldIndex;
import org.springframework.data.elasticsearch.annotations.FieldType;

import com.fasterxml.jackson.annotation.JsonProperty;

@Document(indexName = "entity-index", type = "entity-type")
public class Entity {
    @Id
    private String id;

    @Field(type = FieldType.Date, index = FieldIndex.not_analyzed, store = true, 
            format = DateFormat.custom, pattern = "yyyy-MM-dd'T'hh:mm:ss.SSS'Z'")
    private Date createDate;

    private String system;
    private double score;

    @Field(type = FieldType.Date, format = DateFormat.date_optional_time)
    @JsonProperty(value = "@timestamp")
    private Date updateDate;
    // omit setter and getter 
}

这是测试

public class EntityDAOTest {
    @Autowired
    private ElasticsearchTemplate template;

    @Before
    public void init() {
        template.createIndex(Entity.class);
        template.putMapping(Entity.class);
    }


    @Test
    public void testCreate() {
        Entity entity = new Entity();
        entity.setId("5");
        entity.setCreateDate(new DateTime(2015,05,27,0,0).toDate());
        entity.setUpdateDate(new DateTime(2015,05,27,0,0).toDate());
        entity.setSystem("systemC");
        entity.setScore(5.7);
        IndexQuery query = new IndexQueryBuilder().withObject(entity).withId(entity.getId()).build();
        template.index(query);
    }

我可以获得已创建实体的映射:

{
   "entity-index": {
      "mappings": {
         "entity-type": {
            "properties": {
               "@timestamp": {
                  "type": "long"
               },
               "createDate": {
                  "type": "date",
                  "store": true,
                  "format": "yyyy-MM-dd'T'hh:mm:ss.SSS'Z'"
               },
               "id": {
                  "type": "string"
               },
               "score": {
                  "type": "double"
               },
               "system": {
                  "type": "string"
               },
               "updateDate": {
                  "type": "date",
                  "format": "date_optional_time"
               }
            }
         }
      }
   }
}

但是,当我搜索curl -X GET /entity-index/_search时,我会收到以下文档:

 {
               "id": "5",
               "createDate": 1432656000000,
               "system": "systemC",
               "score": 5.7,
               "@timestamp": 1432656000000
 }

和日期字段都是长类型,如何获取日期格式:' 2015-08-17T12:00:00.000'?

4 个答案:

答案 0 :(得分:13)

您的映射已正确创建。问题更可能来自Jackson JSON序列化程序。您应该尝试将此批注添加到日期字段中:@JsonFormat (shape = JsonFormat.Shape.STRING, pattern ="yyyy-MM-dd'T'HH:mm:ss.SSSZZ")

还有一些alternative solutions可能更适合您的情况(即创建CustomDateSerializer等)。

答案 1 :(得分:1)

Starting from Elasticsearch 7,您不应使用yyyy,而应使用uuuu。例如:

@Field(type = FieldType.Date, format = DateFormat.custom, pattern = "uuuu-MM-dd'T'HH:mm:ss.SSSZZ")
private Date lastModifiedDate;

您不需要@JsonProperty,因为现在Spring Data Elasticsearch不再使用Jackson,而是使用MappingElasticsearchConverter。使用此注释,将为此属性自动创建并使用一个转换器。

答案 2 :(得分:0)

以下设置对我有用。 注意:在测试此更改之前,请删除索引。确保所有位置的图案都相同。

@Field(type = FieldType.Date, store = true, format = DateFormat.custom, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
@JsonFormat (shape = JsonFormat.Shape.STRING, pattern ="yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
private Date date;

答案 3 :(得分:0)

注意事项:

<块引用>

JSON 没有日期数据类型,因此 Elasticsearch 中的日期可以 要么是:

  • 包含格式化日期的字符串,例如“2015-01-01”或“2015/01/01. 12:10:30”。
  • 表示自纪元以来的毫秒数的长数字。
  • 一个整数,表示自纪元以来的秒数。

同样来自同一个文档:

<块引用>

日期将始终呈现为字符串,即使它们最初是 在 JSON 文档中以 long 形式提供

这意味着查询日期字段的数据类型将始终是字符串、长整型或整数。弹性搜索中没有特殊的“日期”字段。

在此处阅读更多信息:https://www.elastic.co/guide/en/elasticsearch/reference/current/date.html