예전에 1.4 버젼으로 개발 할 때는 Sort하는 방법을 하나밖에 몰랐습니다.
Sort 클래스를 이용하는 거였는데요
방법은 아래와 같습니다.
물론 예전에는 Hits 객체에다가 바로 받아왔지만 현재는 Hits 는 deprecated 되었으므로
위와 같이 사용합니다.
그리고 지금은 하나의 방법을 더 알게 되었는데 그것이
SortField를 사용하는 방법입니다.
위의 예제를 SortField를 사용하는 방식으로
변경해보면
한줄이 더 들어갔는데요 SortField를 사용하는 방식은 아무튼 위와 같습니다.
그러면 저것이 무슨 이득이 있는가..? 하는건데요..
아파치에서 제공한 Solr이라는 검색서버를 보면 알 수 있습니다.
XML에 설정되어 있는 필드와 필드타입에 따라서 SortField를 자유자재로
설정하고 있습니다.
Solr에서 sort를 하기 위해서 요청하는 쿼리는
sort=title desc, score asc, name desc
이런식입니다. 제목역순, 점수순, 이름역순 이렇게 여러가지의 정렬 조건을 사용 할 수도 있습니다.
이것을 parsing하는 부분을 보면 이 SortField를 사용하고 있습니다.
xml에 설정된 필드 내용을 IndexSchema에 넣어놓고 여기서
SchemaField를 가져옵니다. 여기에는 필드명과 필드타입(String,Long..)이 설정되어
있겠죠.. 이정보만 가지고 유동적으로 SortField를 생성 할 수 있습니다.
점수순일 경우에는
점수 역순 일 경우에는
그 외에는
를 사용하면 SortField를 생성 할 수 있습니다.
그 외 조건들은 SortField 클래스를 좀 더 살펴보면 자세히 알 수 있습니다.
그리고 1.4부터 있던 내용인데..
Sort를 하려는 필드는 NOT_ANALYZED 여야 합니다.
만약, Sort를 하려는 필드가 반드시 분석(ANALYZED 혹은 TOKENIZED) 되어야 한다면
필드를 두개 만들어야 합니다.
검색 할 때 사용 할 필드와 정렬 할 때 사용 할 필드...
이런식으로요...
분석된 필드를 sort하려고 하니
there are more terms than documents in field "name", but it's impossible to sort on tokenized fields
이런 exception이 발생하네요.
아마 저것이 위의 경우 말고도 하나의 document에 같은 필드를 여러개 추가하는 경우에도
발생하는 것으로 알고 있습니다.
이런 경우죠...
sort에 대한 내용은
http://hudson.zones.apache.org/hudson/job/Lucene-trunk/javadoc/org/apache/lucene/search/Sort.html
여기서 참고하세요~
Sort 클래스를 이용하는 거였는데요
방법은 아래와 같습니다.
Sort sort = new Sort("TITLE", true);
TopFieldDocs tfd = searcher.search(query,null,50,sort);
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);
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)
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
여기서 참고하세요~