如何使用LocalDate从spring查询elasticsearch

问题描述 投票:0回答:2

有此搜索查询:

final SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(QueryBuilders.rangeQuery("updateTime").gte(LocalDate.now())).build();
final List<ActivityValue> listOf = elasticsearchTemplate.queryForList(searchQuery, ActivityValue.class);

使用实体 ActivityValue:

@Document(indexName = "tracking1", type = "activity")
public class ActivityValue {

@Id
private String id;

@Field(type = FieldType.Date, index = false, store = true, format = DateFormat.custom, pattern = "yyyy-MM-dd")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
private LocalDate updateTime;

@Field(type = FieldType.Object, includeInParent = true)
private Vendor vendor;

@Field(type = FieldType.Object, includeInParent = true)
private QCriteria quality;

public ActivityValue() {
}

//setter and getter
}

如果我运行查询并尝试接收列表,我会收到以下异常:

caused by: java.io.IOException: can not write type [class java.time.LocalDate]

实体之前存储的实际日期为LocalDate。 我不确定查询 Elasticsearch 并解决此错误的最佳/最简单方法是什么。有人可以帮忙吗?

spring elasticsearch
2个回答
2
投票
final SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(QueryBuilders.rangeQuery("updateTime").gte(LocalDate.now().toString())).build();
final List<ActivityValue> listOf = elasticsearchTemplate.queryForList(searchQuery, ActivityValue.class);

我通过使用

LocalDate.now().toString()
而不是
LocalDate.now()

解决了这个问题

0
投票

而是使用自定义模式(您还必须在任何

@Field
上设置),您可以从
objectmapper
禁用默认行为。默认行为是将 LocalDate 转换为时间戳。

    //For LocalDateTime usage
    final ObjectMapper objectMapper = new ObjectMapper().registerModule(new JavaTimeModule());
    objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
    final JacksonJsonpMapper jsonpMapper = new JacksonJsonpMapper(objectMapper);

这样做,您可以确保自动以

yyyy-MM-ddThh:mm:ss.SSSZ
格式存储,而不是在 epoc 时间后的几毫秒内存储。

现在您可以将数据设置为:

 static class Data {
      private LocalDateTime dateTime;
 }

并使用类似于以下的查询进行搜索:

RangeQuery rangeQuery = new RangeQuery.Builder().field("dateTime").lt(JsonData.of(LocalDateTime.now())).build();

没有问题或任何额外的努力。

© www.soinside.com 2019 - 2024. All rights reserved.