서비스 프레임워크 설명서 |
검색 결과에서 제외할 레코드도 이들의 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. …
이제 문서 랭킹 기능이 추가된 페이지를 실행해 보자. 문서 랭킹에 따라 레코드들이 정렬되고, 제외 레코드들은 더 이상 검색 결과에 포함되지 않는 것을 확인할 수 있다.