Solr4:数据导入(dataimport)时,不符合Solr日期类型要求的字段的处理
背景:
要求将一个SQL Server2012版本中的数据库导入到Solr中。数据表中有一字段用来存储birthday日期字段,为nvarchar类型,长度为8,格式为:yyyyMMdd。
导入Solr数据结构字段名为birthday,字段类型为date。
Solr的date是不认yyyyMMdd格式的日期的,它要求格林威治时间格式,这就要求转换。示范:“19800103”转换为“1980-01-03T00:00:00.000Z”。
思路一:
在SQL查询数据时做转换,用到cast函数与dateadd函数。因为时区问题。语句如下:
select top 100 dateadd(hour,8,cast(Birthday as datetime)) Birthday from dbo.INFO
这样并没有彻底解决问题,因为数据的不正确性,有数据压根就不是yyyyMMdd格式的。
思路二:
在Solr中想办法,就是在数据进来时,判断日期的正确性,不正确赋初始值;正确转换为Solr接受的日期格式。
Solr的schema.xml中,date字段对应的类为TrieDateField,完整包名为:org.apache.solr.schema.TrieDateField。查看TrieDateField代码,最终生成日期的为org.apache.solr.schema.DateField类的parseMath(Date now, String val)方法。
对DateField.java文件作少许改动,以适应8位长度的日期。代码如下:
public Date parseMath(Date now, String val) {
String math = null;
final DateMathParser p = new DateMathParser();
if (null != now)
p.setNow(now);
if (val.startsWith(NOW)) {
math = val.substring(NOW.length());
} else {
final int zz = val.indexOf(Z);
if (0 < zz) {
math = val.substring(zz + 1);
try {
// p.setNow(toObject(val.substring(0,zz)));
p.setNow(parseDate(val.substring(0, zz + 1)));
} catch (ParseException e) {
throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,
"Invalid Date in Date Math String:'" + val + '\'', e);
}
} else {
if (val.trim().equals("")) {
// 注意:数据为空字符串,或者由空格组成,返回1970...,只是因为自己项目的需要
return new Date(0L);
}
if (val.length() == 8) {
try {
Calendar cal = Calendar.getInstance();
cal.set(Integer.parseInt(val.substring(0, 4).trim()),
Integer.parseInt(val.substring(4, 6).trim()) - 1,
Integer.parseInt(val.substring(6, 8).trim()));
p.setNow(cal.getTime());
} catch (NumberFormatException e) {
e.printStackTrace();
// 注意:解析不成功返回1970...,只是因为自己项目的需要;
return new Date(0L);
}
} else {
throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,
"Invalid Date String:'" + val + '\'');
}
}
}
if (null == math || math.equals("")) {
return p.getNow();
}
try {
return p.parseMath(math);
} catch (ParseException e) {
throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,
"Invalid Date Math String:'" + val + '\'', e);
}
}
将此类生成的class文件放到solr\WEB-INF\lib\solr-core-4.6.0.jar包中,重新启动tomcat,经测试,问题解决。
Solr4:数据导入(dataimport)时,不符合Solr日期类型要求的字段的处理的更多相关文章
- 数据导入Excel时,出现ole error 800AC472这个错误,怎么解决。
我也出现过这个问题 在生成报表的时候不要动EXCEL中的任何单元格 让它完成保存就可以了 或者是把office 2003 删除下载一个office 2000就可以解决 据说是版本兼容的问题 不是高手 ...
- 通过kettle数据导入mysql时,空值的处理在插入mysql时,会自动转转换为null值,无法插入
1.windows下C:\Users\用户名\.kettle目录中找到kettle.properties文件,增加KETTLE_EMPTY_STRING_DIFFERS_FROM_NULL=Y2.Li ...
- DataTable 数据导入MS ACCESS 数据库中 数字类型字段为空的解决办法
string strSql = "insert into GongCheng (GCSY,GCBH,GCBHOLD,GCMC,GCKCJD,GCJSDW,GCSJDW,GCKCDW,GCSG ...
- CDH离线数据导入solr:利用MapReduceIndexerTool将json文件批量导入到solr
场景描述:前段时间,将实时数据通过kafka+flume+morphline的方式接入到solr中.新进来的数据已经可以在solr中看到了,但是以前的历史数据还没有导入solr. CDH提供利用Map ...
- solr 学习之数据导入
将数据库中的数据导入到我们的solr索引库中(DataImportHandler) 1.将jdbc的jar包和solr包中的DataImport的jar包拷贝到webapp中solr/WEB-INF/ ...
- 使用sqlldr将文件中的数据导入到数据库
1.创建数据文件: ?如,在D:\创建 zhaozhenlong.txt 文件,文件内容为: 11,12,1321,22,2331,32,33 2.创建控制文件: 如,在D:\创建 zhaozhenl ...
- 将Excel中数据导入数据库(三)
上篇文章将Excel中数据导入数据库时,将从Excel读入的数据均转换成了数据库相应字段的类型,其实这是没有必要的,因为对于数据库各种类型的插入,均可以字符串格式插入.比如表WQ_SWMSAR_A字段 ...
- 导入sql时报日期类型错误
导入的脚本中有的日期类型数据是:0000-00-00 00:..这种格式的. 需要把这种格式修改一下.有的mysql版本不支持这种0000.设置成当前时间即可
- KUDU数据导入尝试一:TextFile数据导入Hive,Hive数据导入KUDU
背景 SQLSERVER数据库中单表数据几十亿,分区方案也已经无法查询出结果.故:采用导出功能,导出数据到Text文本(文本>40G)中. 因上原因,所以本次的实验样本为:[数据量:61w条,文 ...
随机推荐
- 使用lock和condition实现的阻塞队列-字符串
在jdk 的API中提供了一个字符串的阻塞队列 : class BoundedBuffer { final Lock lock = new ReentrantLock(); final Conditi ...
- 在Win7 环境使用Java API 上传文件到 Hadoop2.x HDFS 问题统计
问题一: org.apache.hadoop.security.AccessControlException: org.apache.hadoop.security .AccessControlExc ...
- Linux(Red Hat 6 32位) 下安装Mysql5.6.30
转载地址:http://my.oschina.net/fusxian/blog/300480 1. 下载MySQL 5.6 下载页面:http://dev.mysql.com/downloads/my ...
- 转载:开发者眼中最好的 22 款 GUI 测试工具
对于很多同学来说gui程序的测试是一个难点,所以我从网上转载了一篇关于gui测试的一篇文章,里面罗列的很多工具,大家可以尝试一下学习学习. 英文原文:22 best GUI testing tools ...
- [Java Web] 6、Tomcat服务器的安装及配置以及JSP技术笔记
目录 1.Web容器简介 2.Tomcat粗介及配置粗讲 3.Tomcat服务器配置 3-1.修改端口号 3-2.配置虚拟目录 3-3.配置首页 4.JSP执行流程 5.JSP粗略了解 1 ...
- [BTS] WCF-SAP adapter
=================================== Exception has been thrown by the target of an invocation. (mscor ...
- Windows对象操作:浏览器窗口信息
属性(值或者子对象):opener:打开当前窗口的源窗口,如果当前窗口是首次启动浏览器打开的,则opener是null,可以利用这个属性来关闭源窗口. 属性:Windows.shuxing; 方法(函 ...
- 结构体快排回顾(sort)
一般来说,我做竞赛的时候排序一般用快排 很快很方便 普通sort(从小到大) sort(a,a+n); 直接贴一段代码吧,包含了vector,sort,结构体等简单东西综合 #include < ...
- javaweb回顾第三篇数据库访问
前言:本篇主要针对数据库的操作,在这里不适用hibernate或者mybatis,用最原始的JDBC进行讲解,通过了解这些原理以后更容易理解和学习hibernate或mybatis. 1:jdbc的简 ...
- Java 泛型总结
1. 泛型类 class Gen<T> { private T t; public T get(){ return t; } public void set(T argt){ t = ar ...