서비스 프레임워크 설명서 |
검색 결과에서 제외할 레코드도 이들의 PK 목록으로 문서 랭킹 사전에 저장된다. 검색 시에는 이 PK를 이용하여 쿼리를 구축한다. 예를 들어 pkey가 105, 205인 레코드들은 검색 결과에서 제외하고자 할 때
kql/myvol> select fd from tbl where (title='코난' or pkey in {300 200 100}) and pkey not in {105 205} order by pkey (300 200 100);
와 같이 검색 조건을 구성한다.
문서 랭킹 조정과 검색 결과 제외는 서비스 프레임워크의 문서 랭킹 API를 이용하여 구현한다. 문서 랭킹 API는 결과로 2차원 문자열 배열을 반환하는데, 첫 번째에는 문서 랭킹을 위한 PK의 배열이 저장되고 두 번째에는 제외할 레코드의 PK 배열이 저장된다.
먼저 문서 랭킹에 따라 검색 조건 및 정렬 조건을 설정하도록 SearchQueryBuilder를 수정한다.
1. <%!public static class SearchQueryBuilder { 2. … 3. public void prepare(HttpServletRequest request, String[][] ranks){ 4. qb.whereColumnEquals("text_idx", query, "allwordthruindex"); 5. // 문서 랭킹에 따른 레코드들은 반드시 포함되도록 OR 조건으로 묶는다. 6. if (ranks[0].length > 0) { 7. qb.setWhereClause("(" + qb.getWhereClause() + " OR " + new QueryBuilder().whereColumnInSet("pkey", ranks[0], true) .getWhereClause() + ")"); 8. } 9. … 10. // 제외 레코드들을 NOT IN 조건으로 걸러낸다. 11. qb.whereColumnNotInSet("pkey", ranks[1], true); 12. } 13. … 14. public SearchQuery getSearchQuery(HttpServletRequest request, String[][] ranks) { 15. SearchQuery sq = new SearchQuery("sample", query); 16. … 17. // 문서 랭킹에 따라 사용자 정의 정렬을 추가한다. 18. qb.orderBy("pkey", ranks[0], RequestUtils.getParameterValues (request, "sort")); 19. sq.setSortingClause(qb.getSortingClause()); 20. return sq; 21. } 22. } 23. %>
이제 검색을 수행하는 JSP 코드를 수정하자.
1. … 2. String[][] ranks = ksfclient.getDocRankings(0, query); 3. CrzClient crzclient = new CrzClient("127.0.0.1", 9577); 4. SearchQueryBuilder builder = new SearchQueryBuilder(query); // 먼저 검색 조건을 구한다. 5. builder.prepare(request, ranks); 6. … 7. // 마지막으로 실제 검색을 수행한다. 8. SearchQuery sq = builder.getSearchQuery(request, ranks); 9. SearchResultSet srs = crzclient.search(sq); 10. …
이제 문서 랭킹 기능이 추가된 페이지를 실행해 보자. 문서 랭킹에 따라 레코드들이 정렬되고, 제외 레코드들은 더 이상 검색 결과에 포함되지 않는 것을 확인할 수 있다.