如何在Spring Data for Apache Solr中表示Solr date类型?
嘿,这个问题我刚好有实战经验!在Spring Data for Apache Solr里处理Solr的date类型其实挺直接的,我给你一步步拆解清楚:
在Spring Data Solr中处理Solr Date类型的方法
1. 实体类字段映射配置
首先,在你的Solr实体类里,给需要映射为Solr date类型的字段加上@Field注解,明确指定Solr字段类型为date。Java侧可以选用两种常见的时间类型:
方案一:使用java.util.Date(无需额外配置)
这是最省心的方式,Spring Data Solr默认支持Date与Solr date类型的转换:
import org.springframework.data.solr.core.mapping.Field; import org.springframework.data.solr.core.mapping.SolrDocument; import java.util.Date; @SolrDocument(collection = "your_target_collection") public class BusinessDocument { // 其他业务字段... @Field(value = "document_create_time", type = "date") private Date createTime; // Getters & Setters 省略 }
方案二:使用Java 8+时间类(如LocalDateTime)
如果你偏好Java 8新增的时间API,需要自定义类型转换器来完成和Solr date的适配,避免序列化/反序列化报错。
第一步:编写转换器类
import org.springframework.core.convert.converter.Converter; import java.time.LocalDateTime; import java.time.ZoneOffset; import java.util.Date; // LocalDateTime 转 Date(适配Solr存储) public class LocalDateTimeToDateConverter implements Converter<LocalDateTime, Date> { @Override public Date convert(LocalDateTime source) { // 统一转换为UTC时区,避免Solr存储时区偏差 return Date.from(source.toInstant(ZoneOffset.UTC)); } } // Date 转 LocalDateTime(适配查询结果映射) public class DateToLocalDateTimeConverter implements Converter<Date, LocalDateTime> { @Override public LocalDateTime convert(Date source) { return source.toInstant().atZone(ZoneOffset.UTC).toLocalDateTime(); } }
第二步:注册转换器到Spring容器
在Solr配置类中,把自定义转换器注册到SolrCustomConversions:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.solr.core.convert.SolrCustomConversions; import java.util.Arrays; @Configuration public class SolrConfig { @Bean public SolrCustomConversions solrCustomConversions() { return new SolrCustomConversions(Arrays.asList( new LocalDateTimeToDateConverter(), new DateToLocalDateTimeConverter() )); } // 如果你自定义了SolrTemplate,记得注入SolrCustomConversions // @Bean // public SolrTemplate solrTemplate(SolrClient solrClient, SolrConverter solrConverter) { // SolrTemplate template = new SolrTemplate(solrClient); // template.setConverter(solrConverter); // return template; // } }
之后就可以在实体类中直接用LocalDateTime了:
@Field(value = "document_update_time", type = "date") private LocalDateTime updateTime;
2. 索引与查询的关键注意事项
- 时区统一:Solr的date类型默认存储UTC时间,所以索引时尽量把Java时间转换为UTC时区(比如用
LocalDateTime.now(ZoneOffset.UTC)),避免时区偏移导致的查询结果不准。 - Solr Schema配置:确保你的Solr集合的schema(或managed-schema)中,对应字段的类型是
date,比如:
<field name="document_create_time" type="date" indexed="true" stored="true"/>
- 查询示例:用Java时间对象直接作为查询条件即可,Spring Data Solr会自动转换为Solr支持的ISO 8601格式(如
2024-05-20T12:30:00.000Z):
import org.springframework.data.solr.core.query.Criteria; import org.springframework.data.solr.core.query.SimpleQuery; import java.util.Date; // 查询创建时间在指定日期之后的文档 public List<BusinessDocument> findDocsCreatedAfter(Date cutoffDate) { Criteria criteria = Criteria.where("document_create_time").greaterThanEqual(cutoffDate); return solrTemplate.queryForList(new SimpleQuery(criteria), BusinessDocument.class); }
内容的提问来源于stack exchange,提问作者Dileepa Jayakody
相关产品推荐
相关产品推荐

