You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:11:48