すべてのプロダクト
Search
ドキュメントセンター

MaxCompute:複数カテゴリ検索

最終更新日:Apr 02, 2025

Proxima CE は複数カテゴリ検索をサポートしています。このトピックでは、複数カテゴリ検索機能の使用方法について説明し、この機能の使用例を示します。

前提条件

Proxima CE パッケージがインストールされていること。詳細については、「Proxima CE パッケージをインストールする」をご参照ください。

カテゴリ別にベクトルをクエリする

複数カテゴリのベクトルデータが存在する場合、複数カテゴリ検索機能を使用して、カテゴリ別にベクトルデータをクエリできます。

テーブル作成ステートメント

CREATE TABLE doc_table_float_smoke(pk STRING,vector STRING, category bigint) PARTITIONED BY (pt STRING);
CREATE TABLE query_table_float_smoke(pk STRING,vector STRING, category bigint) PARTITIONED BY (pt STRING);

入力テーブルへのデータのインポート

基本的なベクトル検索の doc テーブルと query テーブルのフィールドは、複数カテゴリ検索のフィールドと似ています。唯一の違いは、複数カテゴリ検索の入力テーブルに BIGINT 型の category フィールドが追加されていることです。 DataWorks [コンソール] の SQL ノードで次のステートメントを実行できます。

重要

doc テーブルと query テーブルの場合、カテゴリの数と値は同じである必要があります。そうでない場合、検索タスクは実行に失敗します。この問題が発生した場合は、カテゴリを手動で調整して不一致の問題を解決する必要があります。

CREATE TABLE category_doc_table_float_smoke(pk STRING, vector STRING, category BIGINT) PARTITIONED BY (pt STRING);
ALTER TABLE category_doc_table_float_smoke add PARTITION(pt='20221111');
INSERT OVERWRITE TABLE category_doc_table_float_smoke PARTITION (pt='20221111') VALUES 
('1.nid','1~1~1~1~1~1~1~1', 1),
('2.nid','2~2~2~2~2~2~2~2', 1),
('3.nid','3~3~3~3~3~3~3~3', 1),
('4.nid','4~4~4~4~4~4~4~4', 2),
('5.nid','5~5~5~5~5~5~5~5', 2),
('6.nid','6~6~6~6~6~6~6~6', 2),
('7.nid','7~7~7~7~7~7~7~7', 3),
('8.nid','8~8~8~8~8~8~8~8', 3),
('9.nid','9~9~9~9~9~9~9~9', 3),
('10.nid','10~10~10~10~10~10~10~10', 4);
-- SELECT * FROM category_doc_table_float_smoke;

CREATE TABLE category_query_table_float_smoke(pk STRING, vector STRING, category BIGINT) PARTITIONED BY (pt STRING);
ALTER TABLE category_query_table_float_smoke add PARTITION(pt='20221111');
INSERT OVERWRITE TABLE category_query_table_float_smoke PARTITION (pt='20221111') VALUES 
('q1.nid','1~1~1~1~2~2~2~2', 1),
('q2.nid','4~4~4~4~3~3~3~3', 2),
('q3.nid','9~9~9~9~5~5~5~5', 3);
-- SELECT * FROM category_query_table_float_smoke;

DataWorks を使用して検索タスクを実行する

この例では、DataWorks を使用して検索タスクを実行し、検索タスクを実行する前に外部ボリュームを作成します。

説明

以下のサンプルコードで使用されているパラメータ構成の詳細については、「リファレンス: Proxima CE パラメータ」をご参照ください。

サンプルコード:

--@resource_reference{"proxima-ce-aliyun-1.0.0.jar"}
jar -resources proxima-ce-aliyun-1.0.0.jar  -- アップロードされた Proxima CE JAR ファイル。
-classpath proxima-ce-aliyun-1.0.0.jar com.alibaba.proxima2.ce.ProximaCERunner  -- メイン関数のエントリクラス。
-doc_table category_doc_table_float_smoke  -- doc テーブルの名前。
-doc_table_partition 20221111  -- doc テーブルのパーティションの名前。
-query_table category_query_table_float_smoke  -- query テーブルの名前。
-query_table_partition 20221111  -- query テーブルのパーティションの名前。
-output_table category_output_table_float_smoke  -- 出力テーブルの名前。
-output_table_partition 20221111  -- 出力テーブルのパーティションの名前。
-data_type float  -- ベクトルデータ型。
-dimension 8 -- ベクトルの次元。
-topk 1 -- トップ K 検索の K の値。
-job_mode train:build:seek:recall  -- 検索タスクを実行するモード。デフォルト値: train:build:seek。このパラメータを train:build:seek:recall に設定すると、検索タスクの取得率を計算できます。
-external_volume_name udf_proxima_ext -- データソースが Object Storage Service (OSS) である外部ボリュームの名前。検索タスクを実行する前に、事前に OSS ディレクトリを作成する必要があります。そうでない場合、検索タスクは実行に失敗します。
-owner_id 123456  -- 所有者 ID。一意である必要があります。
-- -category_row_num 1 -- 小さなカテゴリでインデックスが作成される行数。ほとんどの場合、デフォルト値を保持できます。
-- -category_col_num 1 -- 小さなカテゴリでインデックスが作成される列数。ほとんどの場合、デフォルト値を保持できます。
-- -category_thread_num 10 -- 実行できる大規模カテゴリ検索タスクの同時実行性。ほとんどの場合、デフォルト値を保持できます。
;

出力結果

+------------+------------+------------+------------+------------+  
| pk         | knn_result | score      | category   | pt         |  
+------------+------------+------------+------------+------------+  
| q1.nid     | 1.nid      | 4.0        | 1          | 20221111   |  
| q2.nid     | 4.nid      | 4.0        | 2          | 20221111   |  
| q3.nid     | 7.nid      | 32.0       | 3          | 20221111   |  
+------------+------------+------------+------------+------------+  

複数のカテゴリからデータをクエリする

query テーブルのデータが複数のカテゴリに属している場合は、各カテゴリから個別にデータをクエリする必要があります。この機能は、単一カテゴリのクエリ機能と競合しません。

テーブル作成ステートメント

CREATE TABLE doc_table_float_smoke(pk STRING,vector STRING, category BIGINT) partitioned by (pt STRING);
CREATE TABLE query_table_float_smoke(pk STRING,vector STRING, multicategory STRING) partitioned by (pt STRING);

入力テーブルへのデータのインポート

基本的なベクトル検索の doc テーブルと query テーブルのフィールドは、複数カテゴリ検索のフィールドと似ています。違いは、複数カテゴリ検索では doc テーブルに BIGINT 型の category フィールドが追加され、query テーブルに STRING 型の multicategory フィールドが追加されることです。DataWorks コンソールの SQL ノードで、次の文を実行できます。

CREATE TABLE category_doc_table_mc_float_smoke(pk STRING, vector STRING, category BIGINT) PARTITIONED BY (pt STRING);
ALTER TABLE category_doc_table_mc_float_smoke add PARTITION(pt='20221111');
INSERT OVERWRITE TABLE category_doc_table_mc_float_smoke PARTITION (pt='20221111') VALUES 
('1.nid','1~1~1~1~1~1~1~1', 1),
('2.nid','2~2~2~2~2~2~2~2', 1),
('3.nid','3~3~3~3~3~3~3~3', 1),
('4.nid','4~4~4~4~4~4~4~4', 2),
('5.nid','1~1~1~1~1~1~1~1', 2),
('6.nid','7~7~7~7~7~7~7~7', 2),
('7.nid','7~7~7~7~7~7~7~7', 3),
('8.nid','8~8~8~8~8~8~8~8', 3),
('9.nid','9~9~9~9~9~9~9~9', 3),
('10.nid','10~10~10~10~10~10~10~10', 4);
-- SELECT * FROM category_doc_table_mc_float_smoke WHERE pt='20221111';


CREATE TABLE category_query_table_mc_float_smoke(pk STRING, vector STRING, multicategory string) PARTITIONED BY (pt STRING);
ALTER TABLE category_query_table_mc_float_smoke add PARTITION(pt='20221111');
INSERT OVERWRITE TABLE category_query_table_mc_float_smoke PARTITION (pt='20221111') VALUES 
('q1.nid','1~1~1~1~2~2~2~2', '1,2'),
('q2.nid','4~4~4~4~3~3~3~3', '2'),
('q3.nid','9~9~9~9~5~5~5~5', '2,3');
-- SELECT * FROM category_query_table_mc_float_smoke WHERE pt='20221111';

DataWorks を使用して検索タスクを実行する

この例では、DataWorks を使用して検索タスクを実行し、検索タスクを実行する前に外部ボリュームを作成します。

説明

以下のサンプルコードで使用されているパラメータ構成の詳細については、「リファレンス: Proxima CE パラメータ」をご参照ください。

サンプルコード:

--@resource_reference{"proxima-ce-aliyun-1.0.0.jar"}
jar -resources proxima-ce-aliyun-1.0.0.jar  -- アップロードされた Proxima CE JAR ファイル。
-classpath proxima-ce-aliyun-1.0.0.jar com.alibaba.proxima2.ce.ProximaCERunner  -- メイン関数のエントリクラス。
-doc_table category_doc_table_mc_float_smoke  -- doc テーブルの名前。
-doc_table_partition 20221111  -- doc テーブルのパーティションの名前。
-query_table category_query_table_mc_float_smoke  -- query テーブルの名前。
-query_table_partition 20221111  -- query テーブルのパーティションの名前。
-output_table category_output_table_mc_float_smoke  -- 出力テーブルの名前。
-output_table_partition 20221111  -- 出力テーブルのパーティションの名前。
-data_type float  -- ベクトルデータ型。
-dimension 8  -- ベクトルの次元。
-topk 2  -- トップ K 検索の K の値。
-job_mode train:build:seek:recall  -- 検索タスクを実行するモード。デフォルト値: train:build:seek。このパラメータを train:build:seek:recall に設定すると、検索タスクの取得率を計算できます。
-external_volume_name udf_proxima_ext -- データソースが OSS である外部ボリュームの名前。検索タスクを実行する前に、事前に OSS ディレクトリを作成する必要があります。そうでない場合、検索タスクは実行に失敗します。
-owner_id 123456  -- 所有者 ID。一意である必要があります。
-query_multi_label true -- このパラメータは複数カテゴリ検索に必要です。このパラメータを true に設定します。
-- -category_row_num 1 -- 小さなカテゴリでインデックスが作成される行数。ほとんどの場合、デフォルト値を保持できます。
-- -category_col_num 1 -- 小さなカテゴリでインデックスが作成される列数。ほとんどの場合、デフォルト値を保持できます。
-- -category_thread_num 10 -- 実行できる大規模カテゴリ検索タスクの同時実行性。ほとんどの場合、デフォルト値を保持できます。
;

出力結果

+------------+------------+------------+------------+------------+  
| pk         | knn_result | score      | category   | pt         |  
+------------+------------+------------+------------+------------+  
| q1.nid     | 2.nid      | 4.0        | 1          | 20221111   |  
| q1.nid     | 5.nid      | 4.0        | 2          | 20221111   |  
| q2.nid     | 4.nid      | 4.0        | 2          | 20221111   |  
| q2.nid     | 5.nid      | 52.0       | 2          | 20221111   |  
| q3.nid     | 6.nid      | 32.0       | 2          | 20221111   |  
| q3.nid     | 7.nid      | 32.0       | 3          | 20221111   |  
+------------+------------+------------+------------+------------+