Solr 4: 데이터 가 져 오기 (dataimport) 시 Solr 날짜 형식 에 맞지 않 는 필드 처리

7078 단어 import
배경:
SQL Server 2012 버 전의 데이터 베 이 스 를 Solr 에 가 져 오 라 고 요구 합 니 다.데이터 시트 에는 birthday 날짜 필드 를 저장 하 는 필드 가 있 습 니 다. nvarchar 형식 이 고 길 이 는 8 이 며 형식 은 yyyMMdd 입 니 다.
Solr 데이터 구조 필드 이름 은 birthday 이 고 필드 형식 은 date 입 니 다.
Solr 의 date 는 yyyMMdd 형식의 날 짜 를 알 아 보지 못 합 니 다. 그리니치 시간 형식 을 요구 합 니 다. 이것 은 변환 을 요구 합 니 다.시범: "1980 0103" 에서 "1980 - 01 - 03T 00: 00: 00 00 Z" 로 전환.
사고방식 1:
SQL 에서 데 이 터 를 조회 할 때 변환 을 하고 캐 스 트 함수 와 dateadd 함 수 를 사용 합 니 다.시간 대 문제 때문에문장 은 다음 과 같다.
select top 100 dateadd(hour,8,cast(Birthday as datetime)) Birthday from dbo.INFO

이렇게 하면 문 제 를 철저히 해결 하지 못 했다. 데이터 의 부정 확 성 때문에 데이터 가 있 으 면 yyyMMdd 형식 이 아니다.
사고방식 2:
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 를 다시 시작 합 니 다. 테스트 를 통 해 문제 가 해결 되 었 습 니 다.

좋은 웹페이지 즐겨찾기