/* */ import java.util.List; import java.util.Properties; import com.ibm.siapi.SiapiException; import com.ibm.siapi.SiapiMessage; import com.ibm.siapi.common.ApplicationInfo; import com.ibm.siapi.search.Query; import com.ibm.siapi.search.Result; import com.ibm.siapi.search.ResultSet; import com.ibm.siapi.search.SearchFactory; import com.ibm.siapi.search.SearchService; import com.ibm.siapi.search.Searchable; import com.ibm.siapi.search.SiapiSearchImpl; /* * The SearchExample class gives a simple example of what is the minimum * required in order to submit a search to the Enterprise Search Search Server. */ public class MySearchExample { private SearchFactory searchFactory = null; private Searchable searchable = null; public static void main(String[] args) throws Exception { // パラメータを読み込みます。 if (args.length < 7) { System.out.println("Usage: MySearchExample <照会語> <ホスト名> <ポート番号>" + "<コレクションID> <アプリケーション名> "); System.out.println("Example Usage: SearchExample OmniFind myhost 80 col1 Default wasUser wasPassword"); return; } String queryString = args[0]; String hostName = args[1]; String portNumber = args[2]; String collectionId = args[3]; String applicationName = args[4]; String wasUser = args[5]; String wasPassword = args[6]; // 初期化を行います。 MySearchExample object = new MySearchExample(); object.init(hostName, portNumber, collectionId, applicationName, wasUser, wasPassword); // 検索を実行し、結果を出力します。 object.execute(queryString); } public void init( String hostName, String portNumber, String collectionId, String applicationName, String wasUser, String wasPassword) throws Exception { // OmniFind 用の SIAPI Search ファクトリーの実装クラスを取得します。 searchFactory = SiapiSearchImpl.createSearchFactory("com.ibm.es.api.search.RemoteSearchFactory"); // 利用可能な検索アプリケーション名(デフォルトは Default)を指定して、 // AppInfo オブジェクトを生成します。 ApplicationInfo appinfo = searchFactory.createApplicationInfo(applicationName); appinfo.setPassword(""); // 検索サービスに接続するための構成情報をセットします。 Properties config = new Properties(); // 検索サービスが稼動しているサーバーのホスト名をセットします。 config.setProperty("hostname", hostName); // 上記ホストの web サーバーポート(デフォルトは 80)をセットします。 config.setProperty("port", portNumber); // 検索タイムアウト値(デフォルトは 30秒)をセットします。 config.setProperty("timeout", "30"); // WAS のグローバル・セキュリティを有効にしているときのユーザー名とパスワードをセットします。 // 有効にしていないときはこの値は無視されます。 config.setProperty("username", wasUser); config.setProperty("password", wasPassword); // 検索サービスに接続します。 SearchService searchService = searchFactory.getSearchService(config); // 検索対象のコレクションに接続します。 try { searchable = searchService.getSearchable(appinfo, collectionId); } catch (SiapiException e) { // 例外メッセージを出力します。 List messages = e.getMessages(); for (int i = 0; i < messages.size(); i++) { SiapiMessage message = (SiapiMessage) messages.get(i); System.out.println(message.getMessage(true)); } return; } } public void execute(String queryString) throws Exception { // 検索を行うための照会オブジェクトを生成します。 Query query = searchFactory.createQuery(queryString); // 照会語の言語を指定します。 query.setQueryLanguage("ja_JP"); // 照会語のスペルチェックの有効/無効を指定します。 (デフォルトは無効) // query.setSpellCorrectionEnabled(true); // 一度に取得する件数を指定します。(デフォルトでは0件目からの10件) // query.setRequestedResultRange(0, 10); // 検索結果を関連度順にソートする際の最大件数を指定します。 (デフォルトは500件) // この値を小さく抑えることで、検索結果の件数は少なくなりますが、応答速度をあげることができます。 // 処理能力の低いマシンで適度の応答速度を得る際などに使用します。 // query.setSortPoolSize(500); // 検索結果をソートする際に指定します。 (デフォルトは SORT_KEY_RELEVANCE) // SORT_KEY_RELEVANCE : 検索結果を関連度順にソートします。 // ヒット件数がソート・プール・サイズを超える場合は、 // ソート・プール・サイズまでソートし、それ以降の文書は削除されます。 // SORT_KEY_DATE : 検索結果を日付順にソートします。 // 内部的には一旦関連度順でソートすることで、 // 関連の高い文書がソート・プール・サイズの枠外に出ることを防いでいます。 // SORT_KEY_NONE : ソートしません。 // (ソートしないため、検索にヒットした文書全件を取得できます。) // query.setSortKey(Query.SORT_KEY_RELEVANCE); // query.setSortKey(Query.SORT_KEY_DATE); // query.setSortKey(Query.SORT_KEY_NONE); // 検索要求を投げ、検索結果を取得します。 ResultSet resultSet = null; try { resultSet = searchable.search(query); } catch (SiapiException e) { // 例外メッセージを出力します。 List messages = e.getMessages(); for (int i = 0; i < messages.size(); i++) { SiapiMessage message = (SiapiMessage) messages.get(i); System.out.println(message.getMessage(true)); } return; } // 検索結果が得られた場合 if(resultSet != null) { // 取得された件数を出力します。 (デフォルトでは最大500件です。) // int available = resultSet.getAvailableNumberOfResults(); // System.out.println("取得された件数: " + available); // ヒット件数の概算値を出力します。 // int estimated = resultSet.getEstimatedNumberOfResults(); // System.out.println("ヒット数概算: " + estimated); // 検索サーバーの処理時間を出力します。 (ネットワーク上の転送時間は含みません。) // long evaluationTime = resultSet.getQueryEvaluationTime(); // System.out.println("処理時間: " + ((double) evaluationTime) / 1000 + "秒"); // System.out.println(); // 結果の配列を取得します。 Result r[] = resultSet.getResults(); if(r != null) { // 1件ずつ文書ID を出力します。 for(int k = 0; k < r.length; k++) { System.out.println("Result " + k + ": " + r[k].getDocumentID()); // 必要に応じて、文書ID 以外の情報も出力できます。 // System.out.println(" Score: " + ((double) ((int) (r[k].getScore() * 100))) / 100 + "%"); // System.out.println(" Title: " + r[k].getTitle()); // System.out.println(" Source: " + r[k].getDocumentSource()); // System.out.println(" Date: " + r[k].getDate()); // System.out.println(" Description: " + r[k].getDescription()); } } } } }