我正在尝试使用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日期获取正确的时间


基础教程推荐
- springboot vue接口测试定义编辑功能的实现 2022-11-15
- java.lang.StackOverflowError出现的原因及解决 2023-02-10
- java封装及四种权限修饰符详解 2023-03-30
- javascript基础——String 2023-08-02
- Java简单实现银行ATM系统 2022-11-19
- 怎么运行jar包 2023-10-08
- Java中单例模式的七种写法示例 2023-08-10
- Java实现飞机大战游戏 附完整源码 2022-11-11
- Java+TestNG接口自动化入门详解 2023-08-08
- Spring Boot静态资源路径的配置与修改详解 2023-05-18