KSF JAVA CLIENT API(KSF-J)는 자바 어플리케이션에서 손쉽게 KSF 서비스를 사용할 수 있도록 도와주는 API입니다. KSF 서버와의 연결 과정을 숨기고 어플리케이션들이 간단한 고수준의 메소드들을 통해 KSF 서버의 서비스를 사용할 수 있게 합니다. 또한 검색 엔진과 상호 작용할 수 있는 고수준의 메소드들을 함께 제공합니다.

KSF-J의 핵심은 com.konantech.ksf.client 패키지에 존재하는 KsfClientCrzClient 클래스 입니다.


KsfClient

KSF 서비스 사용 시에는 연결하고자 하는 KSF 서버에 대한 클라이언트를 나타내는 KsfClient를 생성하고, 필요한 서비스에 대한 API를 호출합니다.

KsfClient ksf = new KsfClient("http://localhost:8080/ksf");

KsfClient 생성 시 KSF 서버와의 네트워크 연결이 이루어지지는 않습니다. 나중에 서비스 API 호출 시 HTTP 통신이 발생합니다.

금칙어

금칙어 추출을 위해서는 getCensoredWords 메소드를 호출합니다. 아래는 검색 전 입력된 키워드 qry로 부터 금칙어를 제외시키는 예제입니다. 금칙어가 제거된 키워드는 modifiedQry에 저장됩니다. 입력된 키워드로부터 추출된 금칙어들은 세션 변수 censored에 저장됩니다.

// filter censored keywords
String[] censored = ksf.getCensoredWords(0, qry);
if (censored.length > 0) {
    // remove censored keywords from search keyword
    modifiedQry = qry;
    for (int i = 0; i < censored.length; i++) {
        modifiedQry = StringUtils.remove(modifiedQry, censored[i]);
    }
    modifiedQry = modifiedQry.trim();
    // save censored keywords
    session.setAttribute("censored", StringUtils.join(censored, ','));
}

오타 교정

오타 교정을 위해서는 suggestSpell 메소드를 호출합니다. 아래는 검색 쿼리에 대한 오타 교정 예제입니다. 검색 쿼리를 단어 별로 분리하여 각 각의 단어에 대해 오타 교정이 가능할 경우 교정합니다. 오타 교정된 쿼리는 세션 변수 spell에 저장됩니다.

boolean corrected = false;
String[] tokens = StringUtils.split(qry);
for (int i = 0; i < tokens.length; i++) {
    String[] spells = ksf.suggestSpell(tokens[i]);
    if (spells.length > 0) {
        // replace incorrect tokens 
        tokens[i] = spells[0];
        corrected = true;
    }
}
if (corrected) {
    // save corrected keywords
    session.setAttribute("spell", StringUtils.join(tokens, ' '));
}

추천 검색어

추천 검색어 목록을 구하기 위해서는 suggestRelated 메소드를 호출합니다.

String[] suggestions = ksf.suggestRelated(0, qry, 10);
session.setAttribute("suggestions", suggestions);

CrzClient

검색 엔진 서비스 사용시에는 해당 검색 엔진에 대한 클라이언트 CrzClient를 생성하고, 필요한 서비스에 대한 API를 호출합니다.

CrzClient crz = new CrzClient("127.0.0.1", 8012);

CrzClient 생성 시에도 검색 엔진과의 네트워크 연결이 당장 이루어지지는 않습니다. 나중에 서비스 API 호출 시 네트워크 통신이 발생합니다.

SearchQuery

검색 엔진에 검색을 요청하기 위해서는 search 메소드를 호출합니다. 호출 시 검색 쿼리를 나타내는 SearchQuery 객체를 전달하고 검색 결과를 SearchResultSet 객체(com.konantech.ksf.client.result 패키지)로 돌려 받습니다.

SearchQuery sq = new SearchQuery("sample", query);
// Set the number of records to read in at once
sq.setLimit(20);
// Set the starting offset which specifies where to start to read in the search results
sq.setOffset(0);
// Set the search expression in the form of an SQL WHERE clause
sq.setWhereClause("title='KONAN' allword");
// Search
SearchResultSet srs = crz.search(sq);

SearchQuery는 검색 질어어 및 검색 결과 수 제어와 관련된 멤버 변수들을 포함합니다.

QueryBuilder

SearchQuery의 멤버 변수들 중 whereClause, sortingClause는 유틸리티 클래스인 QueryBuilder를 이용하여 아래와 같이 쉽게 작성할 수 있습니다.

QueryBuilder qb = new QueryBuilder();
// build where clause
qb.whereColumnEquals("title", query, "allword")
  .whereColumnInDateRange("regdate", "2013.01.01", "2013.12.31")
  .whereColumnInSet("fileext", new Object[] {"doc","ppt","xls"}, true);
// build sorting clause
qb.orderBy("regdate desc");

SearchQuery sq = new SearchQuery("sample", query);
sq.setWhereClause(qb.getWhereClause());
sq.setSortingClause(qb.getSortingClause());
SearchResultSet srs = crz.search(sq);

SearchResultSet

CrzClient는 검색 결과를 결과 집합에 넣어 반환합니다. SearchResultSet는 검색 엔진으로 부터 반환받은 검색 결과 집합을 나타냅니다. java.sql.ResultSet 인터페이스를 본따 작성되었으며, ResultSet 인터페이스와 유사한 방식으로 결과값을 탐색할 수 있습니다.

while (srs.next()) {
    // get column values from this record
    // you can pass the name of column to get the value
    String name = srs.getString("name");
    // or column index instead of column name
    String position = srs.getString(1);
}

KSF-J 어플리케이션 빌드

KSF JAVA CLIENT API는 배포되는 KSF 웹어플리케이션에 포함되어 있습니다. KSF-J를 사용하는 어플리케이션을 빌드하고 실행하기 위해서는 몇 가지 라이브러리들을 클래스 패스에 포함해야 합니다.

이 장에 포함된 예제들은 빌드 시 ksf-client-1.x.jar가 클래스 패스에 있어야 합니다.

실행 시에는 아래와 같은 추가 라이브러리들이 클래스 패스에 있어야 합니다.

konansearch-5.x.jar, commons-codec-1.3.jar, commons-logging-1.1.1.jar, httpclient-4.0.1.jar, httpcore-4.0.1.jar, jackson-core-asl-1.8.1.jar, jackson-mapper-asl-1.8.1.jar

Maven 사용 시에는 프로젝트의 pom.xml에 아래와 같은 의존성을 추가함으로써 간단하게 빌드 및 실행 시 필요한 라이브러리들을 어플리케이션에 포함시킬 수 있습니다.

    <dependency>
        <groupId>com.konantech</groupId>
        <artifactId>ksf-client</artifactId>
        <version>1.x</version>
    </dependency>