要求將一個SQL Server2012版本中的數據庫導入到Solr中。數據表中有一字段用來存儲birthday日期字段,爲nvarchar類型,長度爲8,格式爲:yyyyMMdd。java
導入Solr數據結構字段名爲birthday,字段類型爲date。數據庫
Solr的date是不認yyyyMMdd格式的日期的,它要求格林威治時間格式,這就要求轉換。示範:「19800103」轉換爲「1980-01-03T00:00:00.000Z」。apache
在SQL查詢數據時作轉換,用到cast函數與dateadd函數。由於時區問題。語句以下:tomcat
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位長度的日期。代碼以下:spa
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,經測試,問題解決。 code