lucene에 (YYYYmmDDHHMMSS) 형태로 저장된 컬럼에 대해 sort를 했는데, 결과가 정확히 소트가 되지 않는 문제가 있었다.

 

 

sort를 할 때는 여러 가지 형태로 가능한데.. 가장 간단한 형태인

- searcher.search(new TermQuery(new Term("dataname", "1")), new Sort("regdt");

 

 

이 경우 Sort객체 안에서 대상 컬럼을 소트하기 전 적절한 형태로 type casting을 하게 되는데, 아무 옵션이 없을 경우 lucene은 먼저 int 그 다음 float으로 그 다음 String으로 casting을 해 보게 된다.

 

위와 같이 YYYYmmDDHHMMSS 형태의 데이터는 두번째 float로 casting이 되어 버리면서 문제가 발생하게 된다.

 

Float.parseFloat("20051004130501")=2.00510045E13
Float.parseFloat("20051006102501")=2.00510066E13
Float.parseFloat("20051005102501")=2.00510045E13

 

그래서 정렬이 제대로 안되는 문제가 있다. 이 문제를 해결 하려면 아래와 같이 SortField를 생성하면서 type을 정해줘야 한다.

Sort sort = new Sort(new SortField("regdt", SortField.STRING, true));
searcher.search(new TermQuery(new Term("dataname", "1")), sort);

 

SortField.Auto라는 것이 있는데, 이 값이 default이고 그렇게 하면 역시 Float로 casting 되어 버리니 반드시 SortField.STRING으로 고정해줘야 한다.

 

아래는 위에 설명된 부분의 실제 lucene 소스 코드이다. (ver 2.0)

 

try {
       Integer.parseInt(termtext);
       ret = getInts(reader, field);
} catch (NumberFormatException nfe1) {
       try {
             Float.parseFloat(termtext);
             ret = getFloats(reader, field);
        } catch (NumberFormatException nfe2) {
             ret = getStringIndex(reader, field);
        }
}

 

** 참고로 String은 Int나 Float에 비해 성능이 떨어진다고 한다.

 

참고 사이트 : http://mail-archives.apache.org/mod_mbox/lucene-java-dev/200511.mbox/%3c729868946.1132944655882.JavaMail.jira@ajax.apache.org%3e

'programming > Java' 카테고리의 다른 글

jstat - Java 가상 머신 통계 데이터 감시 툴  (0) 2006.06.30
linux signal 처리하는 방법  (0) 2006.05.27
Java web app monitoring for JAMON  (0) 2006.05.16

+ Recent posts