본문 바로가기

Lucene

[lucene] Sort와 SortField

예전에 1.4 버젼으로 개발 할 때는 Sort하는 방법을 하나밖에 몰랐습니다.

Sort 클래스를 이용하는 거였는데요

방법은 아래와 같습니다.

Sort sort = new Sort("TITLE", true);
TopFieldDocs tfd = searcher.search(query,null,50,sort);

물론 예전에는 Hits 객체에다가 바로 받아왔지만 현재는 Hits 는 deprecated 되었으므로
위와 같이 사용합니다.

그리고 지금은 하나의 방법을 더 알게 되었는데 그것이

SortField를 사용하는 방법입니다.

위의 예제를 SortField를 사용하는 방식으로

변경해보면

SortField sf = new SortField("TITLE",SortField.STRING,true);
Sort sort = new Sort(sf);
TopFieldDocs tfd = searcher.search(query,null,50,sort);

한줄이 더 들어갔는데요 SortField를 사용하는 방식은 아무튼 위와 같습니다.

그러면 저것이 무슨 이득이 있는가..? 하는건데요..

아파치에서 제공한 Solr이라는 검색서버를 보면 알 수 있습니다.

XML에 설정되어 있는 필드와 필드타입에 따라서 SortField를 자유자재로

설정하고 있습니다.

Solr에서 sort를 하기 위해서 요청하는 쿼리는

sort=title desc, score asc, name desc

이런식입니다. 제목역순, 점수순, 이름역순 이렇게 여러가지의 정렬 조건을 사용 할 수도 있습니다.

이것을 parsing하는 부분을 보면 이 SortField를 사용하고 있습니다.

xml에 설정된 필드 내용을 IndexSchema에 넣어놓고 여기서

SchemaField를 가져옵니다. 여기에는 필드명과 필드타입(String,Long..)이 설정되어

있겠죠.. 이정보만 가지고 유동적으로 SortField를 생성 할 수 있습니다.


점수순일 경우에는

SortField sf = SortField.SCORE_FIELD;


점수 역순 일 경우에는

SortField sf = new SortField(null, SortField.SCORE, false);


그 외에는

new SortField(FIELDNAME, SortField.SCORE, REVERSE)


를 사용하면 SortField를 생성 할 수 있습니다.


그 외 조건들은 SortField 클래스를 좀 더 살펴보면 자세히 알 수 있습니다.

그리고 1.4부터 있던 내용인데..

Sort를 하려는 필드는 NOT_ANALYZED 여야 합니다.

만약, Sort를 하려는 필드가 반드시 분석(ANALYZED 혹은 TOKENIZED) 되어야 한다면

필드를 두개 만들어야 합니다.

검색 할 때 사용 할 필드와 정렬 할 때 사용 할 필드...

document.add(new Field("TITLE", value, Field.Store.NO. Field.Index.ANALYZED)
document.add(new Field("TITLE_FOR_SORT", value, Field.Store.NO, Field.Index.NOT_ANALYZED)

이런식으로요...

분석된 필드를 sort하려고 하니

there are more terms than documents in field "name", but it's impossible to sort on tokenized fields

이런 exception이 발생하네요.

아마 저것이 위의 경우 말고도 하나의 document에 같은 필드를 여러개 추가하는 경우에도
발생하는 것으로 알고 있습니다.

document.add(new Field("TITLE_FOR_SORT", value, Field.Store.NO, Field.Index.NOT_ANALYZED)
document.add(new Field("TITLE_FOR_SORT", value2, Field.Store.NO, Field.Index.NOT_ANALYZED)

이런 경우죠...

sort에 대한 내용은

http://hudson.zones.apache.org/hudson/job/Lucene-trunk/javadoc/org/apache/lucene/search/Sort.html

여기서 참고하세요~