DashVector コレクションで、指定されたベクター、プライマリキー、またはメタデータフィルターに一致するドキュメントを検索します。このページの例では Java SDK を使用します。
検索モード
query メソッドは、指定するパラメーターに応じて、以下の検索モードをサポートします。
| モード | パラメーター | ユースケース |
|---|---|---|
| ベクター検索 | vector | 密ベクトルに最も近いドキュメントを検索 |
| プライマリキー検索 | id | ベクター値を再指定せずに、保存されているベクターに類似したドキュメントを検索 |
| フィルター検索 | vector または id + filter | メタデータ条件で類似度結果を絞り込む |
| 密ベクトル + 疎ベクトルのハイブリッド検索 | vector + sparseVector | セマンティック類似度とキーワード関連性を組み合わせる |
| フィルターのみのクエリ | filter のみ ( vector または id なし) | 類似度によるランキングなしで、メタデータ条件に一致するドキュメントを取得 |
前提条件
開始する前に、以下を確認してください。
DashVector クラスター。詳細については、「クラスターの作成」をご参照ください。
API キー。詳細については、「API キーの管理」をご参照ください。
最新バージョンの DashVector Java SDK。詳細については、「DashVector SDK のインストール」をご参照ください。
API シグネチャ
DashVectorCollection は、同期と非同期の 2 つのクエリメソッドを提供します。
// 同期
public Response<List<Doc>> query(QueryDocRequest queryDocRequest);
// 非同期
public ListenableFuture<Response<List<Doc>>> queryAsync(QueryDocRequest queryDocRequest);どちらのメソッドも、QueryDocRequestBuilder で構築された QueryDocRequest オブジェクトを受け入れます。同期メソッドは、結果が返されるまでブロックします。非同期メソッドは、検索が完了したときに解決される ListenableFuture を返します。
例
以下の例はすべて、quickstart という名前のコレクションをクエリします。いずれかの例を実行する前に、以下を行ってください。
ベクターによる検索
密ベクトルを渡して、最も類似したドキュメントを検索します。
import com.aliyun.dashvector.DashVectorClient;
import com.aliyun.dashvector.DashVectorCollection;
import com.aliyun.dashvector.common.DashVectorException;
import com.aliyun.dashvector.models.Doc;
import com.aliyun.dashvector.models.Vector;
import com.aliyun.dashvector.models.requests.QueryDocRequest;
import com.aliyun.dashvector.models.responses.Response;
import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args) throws DashVectorException {
DashVectorClient client = new DashVectorClient("YOUR_API_KEY", "YOUR_CLUSTER_ENDPOINT");
DashVectorCollection collection = client.get("quickstart");
// 4 次元のクエリベクターを構築
Vector vector = Vector.builder().value(Arrays.asList(0.1f, 0.2f, 0.3f, 0.4f)).build();
// ベクター値を含め、類似度が最も高い上位 100 件のドキュメントを返す
QueryDocRequest request = QueryDocRequest.builder()
.vector(vector)
.topk(100)
.includeVector(true)
.build();
Response<List<Doc>> response = collection.query(request);
assert response.isSuccess();
System.out.println(response);
// 出力例:
// {
// "code": 0,
// "message": "Success",
// "requestId": "b26ce0b8-0caf-4836-8136-df889d79ae91",
// "output": [
// {
// "id": "1",
// "vector": {
// "value": [0.10000000149011612, 0.20000000298023224, 0.30000001192092896, 0.4000000059604645]
// },
// "fields": {
// "name": "田中太郎",
// "age": 20,
// "weight": 100.0,
// "anykey1": "String",
// "anykey2": 1,
// "anykey3": true,
// "anykey4": 3.1415926
// },
// "score": 1.1920929E-7
// }
// ]
// }
}
}注: includeVector(true) を設定すると、各結果にベクターデータが返されます。topk の値が大きい場合にパフォーマンスを向上させるには、生のベクターが必要でない限り、このパラメーターをデフォルト値 ( false ) のままにしてください。
プライマリキーによる検索
ベクター値を再指定せずに、保存されているドキュメントのベクターを使用して検索します。ドキュメント ID を指定し、オプションで返すフィールドを選択します。
QueryDocRequest request = QueryDocRequest.builder()
.id("1")
.topk(100)
.outputFields(Arrays.asList("name", "age")) // name と age フィールドのみを返す
.includeVector(true)
.build();
Response<List<Doc>> response = collection.query(request);
assert response.isSuccess();メタデータフィルターを使用した検索
ベクター検索またはプライマリキー検索とメタデータフィルターを組み合わせて、結果を絞り込みます。フィルターは SQL の WHERE 句の構文を使用します。
Vector vector = Vector.builder().value(Arrays.asList(0.1f, 0.2f, 0.3f, 0.4f)).build();
QueryDocRequest request = QueryDocRequest.builder()
.vector(vector) // または、プライマリキー検索には .id("1") を使用
.topk(100)
.filter("age > 18") // SQL の WHERE 句の構文
.outputFields(Arrays.asList("name", "age"))
.includeVector(true)
.build();
Response<List<Doc>> response = collection.query(request);
assert response.isSuccess();filter パラメーターは、標準の SQL 比較演算子および論理演算子をサポートします。
| フィルター式 | 意味 |
|---|---|
"age > 18" | age が 18 より大きいドキュメント |
"age >= 18 AND name = 'zhangsan'" | age が 18 以上 かつ name が zhangsan |
"weight < 80 OR age > 30" | weight が 80 未満 または age が 30 より大きいドキュメント |
フィルター構文の完全なリファレンスについては、「条件付きフィルタリング」をご参照ください。
密ベクトルと疎ベクトルによるハイブリッド検索
密ベクトルと疎ベクトルを組み合わせて、セマンティック類似度とキーワード関連性を融合させます。疎ベクトルは、キーワードを意識したセマンティック検索のためのキーワードの重みを表します。
Vector vector = Vector.builder().value(Arrays.asList(0.1f, 0.2f, 0.3f, 0.4f)).build();
QueryDocRequest request = QueryDocRequest.builder()
.vector(vector)
.sparseVector(
new HashMap<Integer, Float>() {{
put(1, 0.4f);
put(10000, 0.6f);
put(222222, 0.8f);
}}) // 疎ベクトル:ディメンションインデックス -> 重み
.build();
Response<List<Doc>> response = collection.query(request);
assert response.isSuccess();フィルターのみのクエリ
類似度ランキングなしで、メタデータ条件に一致するドキュメントを取得します。このモードを使用するには、vector と id の両方を省略します。
QueryDocRequest request = QueryDocRequest.builder()
.topk(100)
.filter("age > 18")
.outputFields(Arrays.asList("name", "age"))
.includeVector(true)
.build();
// ベクターや ID なし -- 結果はメタデータのみでフィルタリングされる
Response<List<Doc>> response = collection.query(request);
assert response.isSuccess();リクエストパラメーター
QueryDocRequest は QueryDocRequestBuilder で構築します。
注: 類似度検索を実行するには、vector または id のいずれかを指定する必要があります。どちらも指定しない場合、クエリは類似度ランキングなしで、filter 条件に一致するドキュメントのみを返します。
| メソッド | 必須 | デフォルト | 説明 |
|---|---|---|---|
vector(Vector vector) | いいえ | - | 検索対象の密ベクトル |
sparseVector(Map<Integer, Float>) | いいえ | - | ハイブリッド検索用の疎ベクトル |
id(String id) | いいえ | - | クエリとして使用するベクターを持つ、保存済みドキュメントのプライマリキー |
topk(int topk) | いいえ | 10 | 類似度でランク付けされた、返す結果の最大数 |
filter(String filter) | いいえ | - | SQL の WHERE 句の構文で記述されたメタデータフィルター。「条件付きフィルタリング |
includeVector(bool includeVector) | いいえ | false | 応答にベクター値を含めるかどうか。生のベクターが必要ない場合は、パフォーマンス向上のため false に設定します。 |
partition(String partition) | いいえ | default | 検索対象のパーティション |
outputFields(List<String> outputFields) | いいえ | すべてのフィールド | 応答に含めるメタデータフィールド |
outputField(String field) | いいえ | - | 応答に単一のメタデータフィールドを追加します。複数回呼び出すことで、さらにフィールドを追加できます。 |
build() | - | - | QueryDocRequest オブジェクトを構築します。 |
応答パラメーター
query メソッドは、以下のアクセサーを持つ Response<List<Doc>> オブジェクトを返します。
| メソッド | タイプ | 説明 | 例 |
|---|---|---|---|
getCode() | int | ステータスコード。詳細については、「ステータスコード | 0 |
getMessage() | String | ステータスメッセージ | success |
getRequestId() | String | トラブルシューティング用の一意のリクエスト ID | 19215409-ea66-4db9-8764-26ce2eb5bb99 |
getOutput() | List<Doc> | 類似度スコアでランク付けされた、一致するドキュメント。「Doc | [{"id":"9","vector":{"value":[0.9,0.9,0.9,0.9]},"fields":{"name":"java_9","age":9},"score":90}] |
isSuccess() | Boolean | 操作が成功したかどうか | true |
関連トピック
ドキュメントの挿入 -- 検索前にコレクションにドキュメントを追加します。
条件付きフィルタリング -- フィルター構文の完全なリファレンスです。
キーワードを意識したセマンティック検索 -- 密ベクトルと疎ベクトルを組み合わせてハイブリッド取得を行います。