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,經測試,問題解決。 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM