Collapse AllExpand All

4.11.2. 검색 결과 제외

검색 결과에서 제외할 레코드도 이들의 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.	…

이제 문서 랭킹 기능이 추가된 페이지를 실행해 보자. 문서 랭킹에 따라 레코드들이 정렬되고, 제외 레코드들은 더 이상 검색 결과에 포함되지 않는 것을 확인할 수 있다.