我正在尝试使用Solr的DataImportHandler来索引来自Oracle DB的一些文档,除了正确读取Oracle Date列到我的文档中之外,一切正常.我将Solr模式中的字段定义为field name=release_date type=date indexed=true s...
我正在尝试使用Solr的DataImportHandler来索引来自Oracle DB的一些文档,除了正确读取Oracle Date列到我的文档中之外,一切正常.
我将Solr模式中的字段定义为
<field name="release_date" type="date" indexed="true" stored="true" multiValued="false"/>
我首先尝试在DataImportHandler中只对日期列进行基本的select语句,但所有日期都使用不正确的时间值进行索引.例如,2004年1月12日上午09:28(美国东部时间)的数据库中的日期被索引为:
<date name="release_date">2004-01-12T05:00:00Z</date>
所有日期值都有正确的日期,但它们都有T05:00:00Z作为时间.我最好的猜测是,它正在将数据库中的时间读取为午夜并将其转换为UTC.如果是这种情况,我希望正确的值读取T14:28:00Z.
为什么不拿起数据库列的时间部分?我知道DIH附带了一个transformer for dates,但我并不完全清楚它应该如何工作.我也尝试过
<field column="RELEASE_DATE" name="release_date" dateTimeFormat="yyyy-MM-dd'T'hh:mm:ss'Z'" />
在DIH,但似乎没有任何改变.
解决方法:
这是完整的代码以及最后的答案(为了更加清晰).
在您的data-config.xml文件中,从DB读取日期并转换为时间戳:
select cast(STRT_DT as timestamp) as STRT_DTTS from DATES
放入DataImportHandler实体,如下所示:
<entity name="startDate" transformer="script:startDateTransform"
query="select cast(STRT_DT as timestamp) as STRT_DTTS from DATES" >
<field column="STRT_DTTS" name="STRT_DT" />
</entity>
此查询将返回oracle.sql.TIMESTAMP,但它不会直接映射到日期.因此需要脚本转换器.因此我们引入脚本:startDateTransform.在相同的data-config.xml中,您可以像这样插入JavaScript:
function startDateTransform(row){
// Get the timestamp and convert it to a date
var dateVal = row.get("STRT_DTTS").dateValue();
// Put the correct date object into the original column
row.put("STRT_DTTS", dateVal);
return row;
}
在这里,我们将时间戳转换为日期,更新列值并返回包含新信息的行.
字段STRT_DT:
<field column="STRT_DTTS" name="STRT_DT" />
现在应该包含正确的日期.
本文标题为:java – 从Solr DataImportHandler中的Oracle日期获取正确的时间
基础教程推荐
- JVM GC 垃圾收集梳理总结 2023-02-20
- maven多模块依赖版本不一致问题解决 2023-07-14
- Java中四种引用详解 2023-08-11
- MyBatis中foreach标签的collection属性的取值方式 2023-04-23
- 往DAO类中注入@PersistenceContext和@Resource的区别详解 2022-10-30
- Springboot详解如何实现SQL注入过滤器过程 2023-01-13
- Java面向对象编程的三大特征 2023-03-16
- springboot实现启动直接访问项目地址 2023-08-08
- Java DirectByteBuffer堆外内存回收详解 2023-06-06
- 基于XML的Spring声明事务控制 2023-03-22