Java SDK を使用した RecallEngine の操作
本トピックでは、Java SDK を使用して RecallEngine でデータ取得および書き込み操作を実行する方法について説明します。
前提条件
検索エンジンのインスタンスを作成済みであり、そのエンドポイント、インスタンス ID、ユーザー名、パスワードを取得済みである。
ターゲットテーブルおよびリコールサービスを RecallEngine で作成してください。
Java SDK のインストール
Maven プロジェクトの pom.xml ファイルに、以下の依存関係を追加します。
<dependency>
<groupId>com.aliyun.openservices.aiservice</groupId>
<artifactId>pairec-sdk</artifactId>
<version>1.0.7</version>
</dependency>RecallEngine クライアントの初期化
API
RecallEngineClient client = new RecallEngineClient(endpoint, username, password);パラメーターの説明
パラメーター | 例 | 説明 |
endpoint | http://ep-xxxxxx.aliyuncs.com | RecallEngine サービスのエンドポイント。 |
username | System.getenv("RECALL_ENGINE_SERVICE_USERNAME") | 認証用ユーザー名を環境変数から取得します。 |
password | System.getenv("RECALL_ENGINE_SERVICE_PASSWORD") | 認証用パスワードを環境変数から取得します。 |
RecallEngine サービスのエンドポイントは、PAI-Rec コンソールの「リコール管理」>「基本情報」ページで確認できます。

オプションの構成方法
メソッド | 説明 |
withRetryTimes(int retryTimes) | 失敗したリクエストに対するリトライ回数を設定します。デフォルト値は 0(リトライなし)です。 |
withHttpClient(OkHttpClient httpClient) | 接続プールやタイムアウトなどのパラメーターを構成するためのカスタム OkHttpClient インスタンスを設定します。 |
注記
クライアントのデフォルト接続タイムアウトは 200 ms、読み取り/書き込みタイムアウトは 500 ms、接続プール内の最大接続数は 1,000 です。
すべてのオプション構成メソッドは、チェーン呼び出しをサポートしています。
例
import com.aliyun.openservices.pairec.recallengine.RecallEngineClient;
// 認証情報を環境変数から取得
String endpoint = System.getenv("RECALL_ENGINE_SERVICE_ENDPOINT");
String username = System.getenv("RECALL_ENGINE_SERVICE_USERNAME");
String password = System.getenv("RECALL_ENGINE_SERVICE_PASSWORD");
// クライアントの作成
RecallEngineClient client = new RecallEngineClient(endpoint, username, password);
// リトライ回数の設定
client.withRetryTimes(2);データの取得
API
public RecallResponse recall(RecallRequest request) throws RecallEngineException;RecallRequest のパラメーター説明
パラメーター | JSON プロパティ名 | 型 | 説明 |
instanceId | instance_id | String | RecallEngine のインスタンス ID。 |
service | service | String | リコールサービス名。 |
version | version | String | リコールサービスのバージョン。 |
uid | uid | String | ユーザー ID。 |
recalls | recalls | Map<String, RecallConf> | リコール構成セット。キーはリコール名、値はリコール構成です。 |
requestId | request_id | String | リクエスト ID(任意)。 |
exposureList | exposure_list | String | 公開リスト(任意)。公開済みコンテンツのフィルタリングに使用されます。 |
contextParams | context_params | Map<String, Object> | コンテキストパラメーター(任意)。カスタムコンテキスト情報を渡すために使用されます。 |
debug | debug | boolean | デバッグモードを有効にするかどうか(任意)。デフォルト値は false です。 |
RecallConf のパラメーター説明
パラメーター | 型 | 説明 |
trigger | String | トリガー項目。リコールのトリガー値です。 |
count | int | 返却されるリコール結果の期待件数。 |
RecallResponse の説明
メソッド | 戻り値の型 | 説明 |
getResult() | Record | リコール結果のレコードセットを取得します。 |
例
import com.aliyun.openservices.pairec.recallengine.*;
import java.util.HashMap;
import java.util.Map;
// リコールリクエストの構築
RecallRequest request = new RecallRequest();
request.setInstanceId("your-instance-id");
request.setService("recall_test");
request.setVersion("V1");
request.setUid("123");
// リコール構成の設定
Map<String, RecallConf> recalls = new HashMap<>();
recalls.put("u2i_recall", new RecallConf("123", 100));
request.setRecalls(recalls);
// リコールの実行
RecallResponse resp = client.recall(request);
Record result = resp.getResult();
// 結果情報の取得
System.out.println("総件数: " + result.size());
System.out.println("フィールド名: " + result.fieldNames());データの書き込み
API
public WriteResponse write(String instanceId, String table, WriteRequest request) throws RecallEngineException;パラメーターの説明
パラメーター | 型 | 説明 |
instanceId | String | RecallEngine のインスタンス ID。 |
table | String | 対象テーブル名。 |
request | WriteRequest | 書き込みリクエストオブジェクト。 |
WriteRequest のパラメーター説明
パラメーター | JSON プロパティ名 | 型 | 説明 |
requestId | request_id | String | リクエスト ID(任意)。 |
content | content | List<Map<String, Object>> | 書き込むデータ内容。各 Map は 1 行のデータを表し、キーはフィールド名、値はフィールド値です。 |
versionId | versionId | String | バージョン ID(任意)。 |
WriteResponse の説明
WriteResponse は Response を継承しており、以下のフィールドを含みます。
メソッド | 戻り値の型 | 説明 |
getRequestId() | String | リクエスト ID。 |
getCode() | String | 状態コード。「OK」が成功時の戻り値です。 |
getMessage() | String | 応答メッセージ。 |
getData() | Map<String, Object> | 応答データ。 |
例
import com.aliyun.openservices.pairec.recallengine.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
// 書き込みリクエストの構築
WriteRequest request = new WriteRequest();
request.setRequestId("write-req-123");
// 書き込むデータの構築
Map<String, Object> item = new HashMap<>();
item.put("user_id", "123");
item.put("item_id", "item_123");
item.put("score", 0.95);
List<Map<String, Object>> content = new ArrayList<>();
content.add(item);
request.setContent(content);
// 書き込みの実行
WriteResponse resp = client.write("your-instance-id", "u2i_table", request);
// 書き込み結果の確認
System.out.println("状態コード: " + resp.getCode()); // 成功時は「OK」が返されます
System.out.println("メッセージ: " + resp.getMessage());リコール結果(Record)の操作
RecallResponse.getResult() メソッドは Record オブジェクトを返します。このオブジェクトは、リコール結果のソート、フィルター、件数制限、処理を行うための一連のチェーン呼び出し可能な操作メソッドを提供します。
API
public Record sort(String name, boolean desc);
public Record retain(int count);
public Record filter(String name);
public Record filterByColumnValue(String name, Predicate<Object> predicate);
public Record filterByValues(Predicate<Map<String, Object>> predicate);
public Record random();
public List<Object> columnValues(String columnName);
public List<String> columnValuesString(String columnName);
public List<String> fieldNames();
public int size();メソッドの説明
メソッド | 説明 |
sort(name, desc) | 指定されたカラムで並べ替えます。desc が true の場合、降順;false の場合、昇順で並べ替えます。 |
retain(count) | 先頭の count 件のレコードを保持します。 |
filter(name) | 指定されたカラムで重複を除去します。 |
filterByColumnValue(name, predicate) | 指定されたカラムの値に基づいてフィルター処理を行い、述語を満たすレコードのみを保持します。 |
filterByValues(predicate) | 全行データに基づいてフィルター処理を行います。述語は各行ごとに Map<String, Object> を受け取ります。 |
random() | レコードをランダムにシャッフルします。 |
columnValues(columnName) | 指定されたカラムのすべての値を取得します。 |
columnValuesString(columnName) | 指定されたカラムのすべての空でない文字列値を取得します。 |
fieldNames() | すべてのフィールド名を取得します。 |
size() | 現在のレコード件数を取得します。 |
注記
sort、retain、filter、filterByColumnValue、filterByValues、およびrandomメソッドは、すべてチェーン呼び出しをサポートするためにthisを返します。Recordはスレッドセーフではありません。マルチスレッド環境では、同じ `Record` インスタンスを同時に操作しないでください。
例
RecallResponse resp = client.recall(request);
Record result = resp.getResult();
// score カラムで降順ソート → item_id で重複除去 → 先頭 10 件を取得
Record processed = result
.sort("score", true)
.filter("item_id")
.retain(10);
System.out.println("処理後の件数: " + processed.size());
// item_id カラムのすべての値を取得
List<String> itemIds = processed.columnValuesString("item_id");
System.out.println("アイテム ID: " + itemIds);
// 条件付きフィルター:score > 0.5 のみを保持
Record filtered = result.filterByColumnValue("score", value -> {
if (value instanceof Number) {
return ((Number) value).doubleValue() > 0.5;
}
return false;
});
// 全行条件によるフィルター
Record filtered2 = result.filterByValues(row -> {
Object category = row.get("category");
return category != null && "video".equals(category.toString());
});完全なサンプルコード
以下は、リコールおよび書き込み操作の完全なサンプルコードです。
import com.aliyun.openservices.pairec.recallengine.*;
import java.util.*;
public class RecallEngineDemo {
public static void main(String[ ] args) throws RecallEngineException {
// 1. クライアントの初期化
String endpoint = System.getenv("RECALL_ENGINE_SERVICE_ENDPOINT");
String username = System.getenv("RECALL_ENGINE_SERVICE_USERNAME");
String password = System.getenv("RECALL_ENGINE_SERVICE_PASSWORD");
RecallEngineClient client = new RecallEngineClient(endpoint, username, password);
client.withRetryTimes(2);
String instanceId = System.getenv("INSTANCE_ID");
// 2. データの書き込み
WriteRequest writeRequest = new WriteRequest();
writeRequest.setRequestId("write-req-001");
List<Map<String, Object>> content = new ArrayList<>();
Map<String, Object> item = new HashMap<>();
item.put("user_id", "123");
item.put("item_id", "item_456");
item.put("score", 0.95);
content.add(item);
writeRequest.setContent(content);
WriteResponse writeResp = client.write(instanceId, "u2i_table", writeRequest);
System.out.println("書き込み結果: " + writeResp.getCode());
// 3. データの取得
RecallRequest recallRequest = new RecallRequest();
recallRequest.setInstanceId(instanceId);
recallRequest.setService("recall_test");
recallRequest.setVersion("V1");
recallRequest.setUid("123");
Map<String, RecallConf> recalls = new HashMap<>();
recalls.put("u2i_recall", new RecallConf("123", 100));
recallRequest.setRecalls(recalls);
RecallResponse recallResp = client.recall(recallRequest);
Record result = recallResp.getResult();
// 4. リコール結果の処理
System.out.println("総件数: " + result.size());
System.out.println("フィールド名: " + result.fieldNames());
// score で降順ソートし、先頭 10 件を取得
Record top10 = result.sort("score", true).retain(10);
System.out.println("上位 10 件: " + top10.toString());
// アイテム ID のリストを取得
List<String> itemIds = top10.columnValuesString("item_id");
System.out.println("上位 10 件のアイテム ID: " + itemIds);
}
}エラー処理
すべてのリコールおよび書き込み操作は、RecallEngineException をスローする可能性があります。これらの操作を呼び出す際には、例外をキャッチする必要があります。
try {
RecallResponse resp = client.recall(request);
// 結果の処理
} catch (RecallEngineException e) {
System.err.println("リコールに失敗しました: " + e.getMessage());
}