背景:

要求将一个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. 导航VC的左右item代码

    代码控制左右item: UIButton *btnCancel = [UIButton buttonWithType:UIButtonTypeCustom];     btnCancel.frame= ...

  2. nginx+php 安装手册

    http://www.cnblogs.com/hxl2009/archive/2013/06/11/3131627.html  [mysql安装] php 安装 1: wget http://ftp. ...

  3. android 一题多改系列——android 打电话实现两种方法

    在android开发中,用户能够拨打电话是最基本的需求.俗话说“条条大路通罗马”,实现拨打电话的方式有多种,今天,就提供最常用两种. 首先,拨打电话,对于用户来说,是一个耗费的操作,因此,需要一定权限 ...

  4. IIS负载均衡

    工具下载链接 http://www.iis.net/downloads/microsoft/application-request-routing#additionalDownloads

  5. 年终知识分享——UML、设计模式、设计原则

                                                                                                        ...

  6. 学习WPF——WPF布局——初识布局容器

    StackPanel堆叠布局 StackPanel是简单布局方式之一,可以很方便的进行纵向布局和横向布局 StackPanel默认是纵向布局的 <Window x:Class="Wpf ...

  7. Windows 8.1 开发过程中遇到的小问题

    最近在开发Windows 8 应用的时候碰到了一个莫名的问题,错误内容如下:(其中 **.DLL是本地创建的项目,在主项目中添加了引用,其中大部分代码是MVVM light 框架库的代码) Syste ...

  8. HTML Meta标签知多少

    文章已同步至个人Blog:Benjamin - 专注前端开发和用户体验 一.基本属性 标签常常被用来定义HTML文档的元数据或者HTTP协议的指向,这些元数据常用在SEO.HTML Pages or ...

  9. netstat常见参数

    -a (all)显示所有选项,默认不显示LISTEN相关-t (tcp)仅显示tcp相关选项-u (udp)仅显示udp相关选项-n 拒绝显示别名,能显示数字的全部转化成数字.-l 仅列出有在 Lis ...

  10. Atitit. C# java 的api 目录封装结构映射总结

    Atitit. C#  java 的api 目录封装结构映射总结 C# java ref System.Reflection System.Type, java.lang.ref concurrent ...