5. 検索処理の実装¶
この章では、 IM-ContentsSearch の検索APIを利用した全文検索の実行方法について説明します。
5.1. はじめに¶
全文検索を実行するために必要な処理は以下の通りです。
- 検索するためのクエリを作成する。
- クエリを指定して検索処理を実行し、検索結果を取得する。
- 取得した検索結果を扱って任意の処理を行う。
5.2. 検索クエリを作成する¶
検索クエリは 検索条件 と 取得条件 で構成されています。
- 検索条件
取得したいコンテンツの条件を設定します。条件にマッチしたコンテンツのみが返却されます。
- 取得条件
検索条件にマッチしたコンテンツを更に絞り込むための条件です。例えば、 取得する最大件数 や 取得するフィールド などを指定します。まず、 Condition のAPIを利用して検索条件を作成します。次に検索クエリのインスタンスを作成し、作成した検索条件と任意の取得条件を設定します。検索条件を作成するサンプル// 検索条件の作成 // 例:TYPEが"example_type"であり、テキストデータに"any_keyword"を含み、ID_ORIGINALフィールドに値が存在する Searchable condition = Condition.type("example_type"). keyword("any_keyword"). exists(Fields.ID_ORIGINAL); // 検索クエリ作成 SearchQuery query = new Query(); // 作成した検索条件の設定 query.setCondition(condition); // 例:全フィールドのデータを保持するコンテンツを、1件目から開始して100件取得する query.addFieldToOutput(Fields.ALL). setOffset(1). setRows(100);コラム
Fields.ALL は取得条件として指定する専用のフィールドになります。検索結果を単純な索引情報として利用する場合には、必要最低限のフィールド(ID_ORIGINAL など)を指定する事により検索処理の負荷を軽減することが可能です。
5.3. 検索処理を実行する¶
作成した検索クエリを ContentsSearchManager#search(SearchQuery) に指定して検索を実行します。検索結果として、 SearchResponse インスタンスが返却されます。検索を実行するサンプルtry { // マネージャのインスタンスを取得 ContentsSearchManager manager = new ContentsSearchManager(); // 全文検索の実行 SearchResponse response = manager.search(query); } catch (InvalidSearchConditionException e) { // 検索条件が不正だった場合 } catch (ContentsSearchExecutionException e) { // 検索処理に失敗した場合 }
5.4. 検索結果を利用する¶
検索処理で取得した検索結果( SearchResponse )を利用して任意の処理を実装します。検索結果コンテンツの利用
取得した検索結果から、検索結果コンテンツを取得して利用する方法です。SearchResponse#getResultContentList() を利用することで、検索結果コンテンツのリストを取得できます。検索結果コンテンツの処理実装サンプル// 検索結果コンテンツのリストを取得 List<ResultContent> contents = response.getResultContentList(); // 検索結果コンテンツごとに処理を実行 for (ResultContent content : contents) { // IDの取得 String id = content.getId(); // 動的フィールドの取得 String anyString = content.getValue(Fields.STRING.toField("any")); // ... 任意の処理 }件数情報の利用
検索結果からは検索結果コンテンツ以外に件数に関する情報が取得できます。共通情報取得のサンプル// 検索条件にヒットした総数(未取得のコンテンツも含む) long found = response.getFound(); // 実際に取得した検索結果コンテンツの件数 long returned = response.getReturned(); // 検索結果コンテンツの取得開始位置 long offset = response.getOffset();