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,经测试,问题解决。
运维网声明
1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网 享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com