背景:

要求将一个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日期类型要求的字段的处理的更多相关文章

  1. 数据导入Excel时,出现ole error 800AC472这个错误,怎么解决。

    我也出现过这个问题 在生成报表的时候不要动EXCEL中的任何单元格 让它完成保存就可以了 或者是把office 2003 删除下载一个office 2000就可以解决 据说是版本兼容的问题 不是高手 ...

  2. 通过kettle数据导入mysql时,空值的处理在插入mysql时,会自动转转换为null值,无法插入

    1.windows下C:\Users\用户名\.kettle目录中找到kettle.properties文件,增加KETTLE_EMPTY_STRING_DIFFERS_FROM_NULL=Y2.Li ...

  3. DataTable 数据导入MS ACCESS 数据库中 数字类型字段为空的解决办法

    string strSql = "insert into GongCheng (GCSY,GCBH,GCBHOLD,GCMC,GCKCJD,GCJSDW,GCSJDW,GCKCDW,GCSG ...

  4. CDH离线数据导入solr:利用MapReduceIndexerTool将json文件批量导入到solr

    场景描述:前段时间,将实时数据通过kafka+flume+morphline的方式接入到solr中.新进来的数据已经可以在solr中看到了,但是以前的历史数据还没有导入solr. CDH提供利用Map ...

  5. solr 学习之数据导入

    将数据库中的数据导入到我们的solr索引库中(DataImportHandler) 1.将jdbc的jar包和solr包中的DataImport的jar包拷贝到webapp中solr/WEB-INF/ ...

  6. 使用sqlldr将文件中的数据导入到数据库

    1.创建数据文件: ?如,在D:\创建 zhaozhenlong.txt 文件,文件内容为: 11,12,1321,22,2331,32,33 2.创建控制文件: 如,在D:\创建 zhaozhenl ...

  7. 将Excel中数据导入数据库(三)

    上篇文章将Excel中数据导入数据库时,将从Excel读入的数据均转换成了数据库相应字段的类型,其实这是没有必要的,因为对于数据库各种类型的插入,均可以字符串格式插入.比如表WQ_SWMSAR_A字段 ...

  8. 导入sql时报日期类型错误

    导入的脚本中有的日期类型数据是:0000-00-00 00:..这种格式的. 需要把这种格式修改一下.有的mysql版本不支持这种0000.设置成当前时间即可

  9. KUDU数据导入尝试一:TextFile数据导入Hive,Hive数据导入KUDU

    背景 SQLSERVER数据库中单表数据几十亿,分区方案也已经无法查询出结果.故:采用导出功能,导出数据到Text文本(文本>40G)中. 因上原因,所以本次的实验样本为:[数据量:61w条,文 ...

随机推荐

  1. Objective 笔记C(第二天)

    属性本质 •什么是属性 在OC中,属性提供了setter和getter方法,本质上属性就是方法,属性的值是由实例变量来保存的. • 属性的本质(一般三个部分组成) a.保存属性值的实例变量int _a ...

  2. ASP.NET MVC学习之过滤器篇(2)

    下面我们继续之前的ASP.NET MVC学习之过滤器篇(1)进行学习. 3.动作过滤器 顾名思义,这个过滤器就是在动作方法调用前与调用后响应的.我们可以在调用前更改实际调用的动作,也可以在动作调用完成 ...

  3. 使用NHibernate(10) -- 补充(inverse && cascade)

    1,inverse属性的作用: 只有集合标记(set/map/list/array/bag)才有invers属性: 以set为例,set的inverse属性决定是否把对set的改动反应到数据库中去,i ...

  4. 控制ASP.NET Web API 调用频率与限流

    ASP.NET MVC 实现 https://github.com/stefanprodan/MvcThrottle ASP.NET WEBAPI 实现 https://github.com/stef ...

  5. 在Debian下编译Postgresql

    今天起床看到床头上的那本<PostgreSQL数据库内核分析>,发觉这书买了这么长时间,虽然大致看了一遍,可还没亲手实践.今天就花了点时间搭了个调试环境. 环境:Debian 7.0 ## ...

  6. Memcached使用小记

    该文章简单记录一下在Windows平台下安装与配置Memcached的方法,Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载. 1.下载Memcached ...

  7. 安卓-PC-Arduino3方通信实现

    请仔细理解相关参数,如端口设置.IP设置.COM口设置......等等.....不要盲目COPY.....这涉及手机.电脑和一个单片机,其中一台电脑作为服务器并与单片机相连,负责通过网络与客户端通信( ...

  8. 使用ConditionalScope进行高效的SharePoint CSOM编程

    在上一篇文章中讲述了 ExceptionHandlingScope的使用后,本章主要讲述ConditionalScope的用法. ConditionalScope在设计思路和解决问题上同Excepti ...

  9. https封装类,支持get/post请求

    所需jar:commons-logging-1.1.3.jar.httpclient-4.3.1.jar.httpcore-4.3.jar package com.onlyou.microfinanc ...

  10. JS获取元素CSS值的各种方法分析

    先来看一个实例:如何获取一个没有设置大小的字体? <!DOCTYPE html> <html lang="en"> <head> <met ...