Proxima CE は、MaxCompute 上の大規模データセットにおいて、カテゴリ別フィルターを適用したベクトル検索(KNN)をサポートします。本トピックでは、以下の 6 種類の構成における検証結果および手順について説明します:カテゴリサイズが混合しているケース、3 種類の距離メジャー(ユークリッド距離、内積、ハミング距離)、2 種類のデータの型(FLOAT および BINARY)、およびマルチラベルクエリのシナリオ。
テストの結論:Proxima CE は、マルチカテゴリ環境において、カテゴリ単位の検索およびカテゴリ単位のマルチラベル検索の両方を正しく処理します。
カテゴリの分類方法
Proxima CE では、カテゴリごとのドキュメント数とカテゴリしきい値に基づき、各カテゴリを「小カテゴリ」または「大カテゴリ」に分類します。
| カテゴリの種類 | 条件 | 処理方法 |
|---|---|---|
| 小カテゴリ | ドキュメント数がカテゴリしきい値未満 | ブロック行列アプローチで、category_row_num および category_col_num |
| 大カテゴリ | ドキュメント数がカテゴリしきい値以上 | 並列処理、category_thread_num |
カテゴリしきい値を十分に高く設定する(例:1,000,000)と、すべてのカテゴリが小カテゴリとして扱われます。一方、しきい値を低く設定する(例:15)と、ドキュメント数が 20 以上のカテゴリは大カテゴリとして扱われます。
パラメーターのリファレンス
以下のパラメーターは、マルチカテゴリ検索の動作を制御します。これらのパラメーターは、ProximaCERunner JAR に対してフラグとして渡します。
| パラメーター | 説明 | 例 |
|---|---|---|
-category_threshold |
小カテゴリと大カテゴリを区別するしきい値 | 15 |
-category_row_num |
小カテゴリのマトリックス計算におけるブロックあたりの行数 | 2 |
-category_col_num |
小カテゴリのマトリックス計算におけるブロックあたりの列数 | 3 |
-category_thread_num |
大カテゴリ検索における並列処理の次数 | 3 |
-topk |
クエリごとに返す最近傍の数 | 5 |
-data_type |
ベクターのデータの型:int8、float、または binary |
int8 |
-dimension |
ベクターのディメンション数 | 2 |
-distance_method |
距離メジャー:ユークリッド距離(デフォルト)、InnerProduct、または hamming |
InnerProduct |
-query_multi_label |
カテゴリ単位のマルチラベル検索を有効にする場合は true を設定します |
true |
-app_id |
Proxima CE アプリケーション ID | 201220 |
テスト手法
以下の 6 ケースにより、異なるカテゴリ構成における結果の正確性を検証します。各ケースでは、データ形式 key+カテゴリ ID-idx,idx~idx,カテゴリ ID(例:key1-1,1~1,1)を使用し、すべてのテストケースでパーティション日付 20210712 を使用します。
ケース 1:小カテゴリと大カテゴリが混在(FLOAT、ユークリッド距離)
目的:小カテゴリと大カテゴリが共存する場合の結果の正確性を検証します。
しきい値を 15 に設定すると、ドキュメント数が 1、5、10 のカテゴリは小カテゴリ(合計 3 個)、ドキュメント数が 20 および 30 のカテゴリは大カテゴリ(合計 2 個)となります。
| パラメーター | 値 |
|---|---|
| ドキュメントテーブル — カテゴリごとのドキュメント数 | 1, 5, 10, 20, 30 |
| クエリーテーブル — カテゴリごとのクエリ数 | 5, 10, 20, 5, 10 |
| カテゴリしきい値 | 15 |
category_row_num |
2 |
category_col_num |
3 |
| 並列処理の次数 | 3 |
| Top K | 5 |
| データの型 | FLOAT |
| 寸法 | 2 |
| 距離尺度 | ユークリッド距離 |
ケース 2:すべて小カテゴリ(FLOAT、ユークリッド距離)
目的:小カテゴリのブロックマトリックス処理が、ケース 1 と同じ結果を生成することを検証します。
ケース 1 と同じデータを使用します。カテゴリしきい値を 1,000,000 に設定することで、すべてのカテゴリが小カテゴリとして扱われます。
| パラメーター | 値 |
|---|---|
| ドキュメントテーブル — カテゴリごとのドキュメント数 | 1, 5, 10, 20, 30 |
| クエリーテーブル — カテゴリごとのクエリ数 | 5, 10, 20, 5, 10 |
| カテゴリしきい値 | 1,000,000 |
category_row_num |
2 |
category_col_num |
3 |
| 並列度 | 該当なし |
| Top K | 5 |
| データの型 | FLOAT |
| ディメンション数 | 2 |
| 距離メジャー | ユークリッド距離 |
ケース 3:すべて小カテゴリ(FLOAT、内積)
目的:すべてのカテゴリが小カテゴリである状態で、内積距離を使用した場合の結果の正確性を検証します。内積では、スコアが高いほど類似度が高くなります。
ケース 2 と同じデータおよびしきい値を使用し、距離メジャーを内積に変更します。
| パラメーター | 値 |
|---|---|
| ドキュメントテーブル — カテゴリごとのドキュメント数 | 1, 5, 10, 20, 30 |
| クエリーテーブル — カテゴリごとのクエリ数 | 5, 10, 20, 5, 10 |
| カテゴリしきい値 | 1,000,000 |
category_row_num |
2 |
category_col_num |
3 |
| 並列処理の次数 | 該当なし |
| Top K | 5 |
| データの型 | FLOAT |
| ディメンション数 | 2 |
| 距離メジャー | 内積 |
ケース 4:すべて小カテゴリ(BINARY、ハミング距離)
目的:バイナリベクターに対するハミング距離での結果の正確性を検証します。ドキュメントおよびクエリーデータが同一であるため、上位の結果に完全一致(スコア 0.0)が含まれます。
| パラメーター | 値 |
|---|---|
| ドキュメントテーブル — カテゴリごとのドキュメント数 | 1, 5, 10 |
| クエリーテーブル — カテゴリごとのクエリ数 | 1, 5, 10 |
| カテゴリしきい値 | 1,000,000 |
category_row_num |
2 |
category_col_num |
3 |
| 並列度 | 該当なし |
| Top K | 5 |
| データの型 | BINARY |
| 寸法 | 4 |
| 距離メジャー | ハミング距離 |
ケース 5:すべて大カテゴリ(FLOAT、ユークリッド距離)
目的:カテゴリ 20 および 30 について、大カテゴリの並列処理がケース 1 と同じ結果を生成することを検証します。
ドキュメントテーブルからカテゴリ 1、5、および 10 を削除します。残るのはカテゴリ 20 および 30 のみであり、いずれもしきい値 15 を超えています。
| パラメーター | 値 |
|---|---|
| ドキュメントテーブル — カテゴリごとのドキュメント数 | 20, 30 |
| クエリーテーブル — カテゴリごとのクエリ数 | 5, 10 |
| カテゴリしきい値 | 15 |
category_row_num |
2 |
category_col_num |
3 |
| 並列処理の次数 | 3 |
| Top K | 5 |
| データの型 | FLOAT |
| ディメンション数 | 2 |
| 距離メジャー | ユークリッド距離 |
ケース 6:マルチラベルクエリ(FLOAT、ユークリッド距離)
目的:複数のカテゴリに割り当てられたクエリが、それぞれのカテゴリから Top K の結果を返すことを検証します。
ドキュメントテーブルはケース 1 と同じです。クエリーベクターには、セミコロン区切りの形式で複数のカテゴリラベルを含めます:key;vector;category1,category2,...。たとえば、key1-1;1~1;1,5,10 はクエリ key1-1 をカテゴリ 1、5、および 10 に割り当てます。
| パラメーター | 値 |
|---|---|
| ドキュメントテーブル — カテゴリごとのドキュメント数 | 1, 5, 10, 20, 30 |
| クエリーテーブル — カテゴリごとのクエリ数 | マルチカテゴリデータ |
| カテゴリしきい値 | 15 |
category_row_num |
2 |
category_col_num |
3 |
| 並列処理の次数 | 3 |
| Top K | 5 |
| データの型 | FLOAT |
| ディメンション数 | 2 |
| 距離メジャー | ユークリッド距離 |
比較テスト
各比較テストには、データの準備、JAR コマンドの実行、および結果の検証というステップが含まれます。すべてのテストケースでパーティション日付 20210712 を使用します。
ケース 1:小カテゴリと大カテゴリが混在(FLOAT、ユークリッド距離)
入力データ:
-
ドキュメントテーブル:カテゴリ 1、5、10、20、および 30(ドキュメント数はそれぞれ 1、5、10、20、30)
-
クエリーテーブル:カテゴリ 1、5、10、20、および 30(クエリ数はそれぞれ 5、10、20、5、10)
-
データの型:FLOAT、ディメンション数 2、ユークリッド距離
ステップ 1:データの準備
ドキュメントテーブルには以下のデータが含まれます:
key1-1,1~1,1
key5-1,1~1,5
... ...
key5-5,5~5,5
key10-1,1~1,10
key10-2,2~2,10
... ...
key10-9,9~9,10
key10-10,10~10,10
key20-1,1~1,20
... ...
key20-20,20~20,20
key30-1,1~1,30
... ...
key30-30,30~30,30
クエリーテーブルには以下のデータが含まれます:
key1-1,1~1,1
... ...
key1-5,5~5,1
key5-1,1~1,5
... ...
key5-10,10~10,5
key10-1,1~1,10
... ...
key10-20,20~20,10
key20-1,1~1,20
... ...
key20-5,5~5,20
key30-1,1~1,30
... ...
key30-10,10~10,30
ステップ 2:JAR コマンドの実行
カテゴリしきい値を 15、category_row_num を 2、category_col_num を 3、並列処理の次数を 3、Top K を 5 に設定した場合、カテゴリ 1、5、および 10 は小カテゴリ(合計 3 個)、カテゴリ 20 および 30 は大カテゴリ(合計 2 個)となります。
odpscmd -e "jar -resources proxima-ce-xl-222.jar -classpath ./proxima-ce-xl-222.jar com.alibaba.proxima2.ce.ProximaCERunner -doc_table cat_doc_table -doc_table_partition 20210712 -query_table cat_query_table -query_table_partition 20210712 -output_table cat_result_table -output_table_partition 20210712 -data_type int8 -dimension 2 -app_id 201220 -category_row_num 2 -category_col_num 3 -topk 5 -category_thread_num 3 -category_threshold 15;"
ステップ 3:結果の検証
各クエリは、そのカテゴリ内で最も近い上位 5 件の最近傍を返します。結果はユークリッド距離スコアの昇順でランク付けされ、0.0 は同一ベクターを示します。結果は期待通りです:
+----+------------+-------+------------+----+
| pk | knn_result | score | category | pt |
+----+------------+-------+------------+----+
| key30-1 | key30-1 | 0.0 | 30 | 20210712 |
| key30-1 | key30-2 | 2.0 | 30 | 20210712 |
| key30-1 | key30-3 | 8.0 | 30 | 20210712 |
| key30-1 | key30-4 | 18.0 | 30 | 20210712 |
| key30-1 | key30-5 | 32.0 | 30 | 20210712 |
... ...
| key20-5 | key20-5 | 0.0 | 20 | 20210712 |
| key20-5 | key20-6 | 2.0 | 20 | 20210712 |
| key20-5 | key20-4 | 2.0 | 20 | 20210712 |
| key20-5 | key20-3 | 8.0 | 20 | 20210712 |
| key20-5 | key20-7 | 8.0 | 20 | 20210712 |
ケース 2:すべて小カテゴリ(FLOAT、ユークリッド距離)
目的:すべてのカテゴリを小カテゴリ処理に切り替える(しきい値を 100 に設定)ことで、ケース 1 と同じ最近傍ランキングが得られることを検証します。
ステップ 1:データの準備。ケース 1 と同じデータを使用します。
ステップ 2:JAR コマンドの実行
カテゴリしきい値を 100 に設定すると、すべてのカテゴリが小カテゴリになります。
odpscmd -e "jar -resources proxima-ce-xl-222.jar -classpath ./proxima-ce-xl-222.jar com.alibaba.proxima2.ce.ProximaCERunner -doc_table cat_doc_table -doc_table_partition 20210712 -query_table cat_query_table -query_table_partition 20210712 -output_table cat_result_table -output_table_partition 20210712 -data_type int8 -dimension 2 -app_id 201220 -category_row_num 2 -category_col_num 3 -topk 5 -category_thread_num 3 -category_threshold 100;"
ステップ 3:結果の検証
期待される結果はケース 1 と同じです。大カテゴリの並列処理から小カテゴリのブロックマトリックス処理への切り替えにより、同一の最近傍ランキングが得られます。結果は期待通りです:
+----+------------+-------+------------+----+
| pk | knn_result | score | category | pt |
+----+------------+-------+------------+----+
| key10-18 | key10-10 | 128.0 | 10 | 20210712 |
| key10-18 | key10-9 | 162.0 | 10 | 20210712 |
| key10-18 | key10-8 | 200.0 | 10 | 20210712 |
| key10-18 | key10-7 | 242.0 | 10 | 20210712 |
| key10-18 | key10-6 | 288.0 | 10 | 20210712 |
...
| key30-8 | key30-8 | 0.0 | 30 | 20210712 |
| key30-8 | key30-9 | 2.0 | 30 | 20210712 |
| key30-8 | key30-7 | 2.0 | 30 | 20210712 |
| key30-8 | key30-6 | 8.0 | 30 | 20210712 |
| key30-8 | key30-10 | 8.0 | 30 | 20210712 |
| key5-5 | key5-5 | 0.0 | 5 | 20210712 |
| key5-5 | key5-4 | 2.0 | 5 | 20210712 |
| key5-5 | key5-3 | 8.0 | 5 | 20210712 |
| key5-5 | key5-2 | 18.0 | 5 | 20210712 |
| key5-5 | key5-1 | 32.0 | 5 | 20210712 |
+----+------------+-------+------------+----+
ケース 3:すべて小カテゴリ(FLOAT、内積)
目的:ユークリッド距離から内積へ切り替えた場合の正しいランキングを検証します。内積では、スコアが高いほど類似度が高くなるため、結果は降順でランク付けされます。
ステップ 1:データの準備。ケース 1 と同じデータを使用します。
ステップ 2:JAR コマンドの実行
odpscmd -e "jar -resources proxima-ce-xl-222.jar -classpath ./proxima-ce-xl-222.jar com.alibaba.proxima2.ce.ProximaCERunner -doc_table cat_doc_table -doc_table_partition 20210712 -query_table cat_query_table -query_table_partition 20210712 -output_table cat_result_table -output_table_partition 20210712 -data_type float -dimension 2 -app_id 201220 -category_row_num 2 -category_col_num 3 -topk 5 -category_thread_num 3 -category_threshold 100 -distance_method InnerProduct;"
ステップ 3:結果の検証
結果は降順でランク付けされます(スコアが高いほど類似度が高い)。ベクター [10, 10] を持つクエリ key10-10 に対して、上位 5 件の結果は内積が最も高いドキュメントベクターとなります:[1,1] のスコアは 20.0、[2,2] のスコアは 40.0、…、[5,5] のスコアは 100.0 です。結果は期待通りです:
+----+------------+-------+------------+----+
| pk | knn_result | score | category | pt |
+----+------------+-------+------------+----+
| key10-10 | key10-1 | 20.0 | 10 | 20210712 |
| key10-10 | key10-2 | 40.0 | 10 | 20210712 |
| key10-10 | key10-3 | 60.0 | 10 | 20210712 |
| key10-10 | key10-4 | 80.0 | 10 | 20210712 |
| key10-10 | key10-5 | 100.0 | 10 | 20210712 |
| key10-19 | key10-1 | 38.0 | 10 | 20210712 |
| key10-19 | key10-2 | 76.0 | 10 | 20210712 |
| key10-19 | key10-3 | 114.0 | 10 | 20210712 |
| key10-19 | key10-4 | 152.0 | 10 | 20210712 |
| key10-19 | key10-5 | 190.0 | 10 | 20210712 |
... ...
| key10-17 | key10-1 | 34.0 | 10 | 20210712 |
| key10-17 | key10-2 | 68.0 | 10 | 20210712 |
| key10-17 | key10-3 | 102.0 | 10 | 20210712 |
| key10-17 | key10-4 | 136.0 | 10 | 20210712 |
| key10-17 | key10-5 | 170.0 | 10 | 20210712 |
| key30-8 | key30-16 | 256.0 | 30 | 20210712 |
| key30-8 | key30-17 | 272.0 | 30 | 20210712 |
| key30-8 | key30-18 | 288.0 | 30 | 20210712 |
| key30-8 | key30-19 | 304.0 | 30 | 20210712 |
| key30-8 | key30-20 | 320.0 | 30 | 20210712 |
+----+------------+-------+------------+----+
ケース 4:すべて小カテゴリ(BINARY、ハミング距離)
目的:バイナリベクターにおける結果の正確性を検証します。ドキュメントおよびクエリーデータが同一であるため、上位の結果に完全一致(ハミング距離 0.0)が含まれます。
ステップ 1:データの準備
ベクターは、0~0~...~0 または 1~1~...~1 としてエンコードされた 32 ビットのバイナリ文字列です。ドキュメントテーブルには以下のデータが含まれます:
key1-1,1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1,1
key5-1,0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0,5
key5-2,0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0,5
key5-3,0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1,5
key5-4,1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1,5
key5-5,1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1,5
key10-1,0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0,10
key10-2,0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0,10
key10-3,0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1,10
key10-4,0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1,10
key10-5,1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1,10
key10-6,1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1,10
key10-7,1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1,10
key10-8,1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1,10
key10-9,1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1,10
key10-10,1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1~1,10
ステップ 2:JAR コマンドの実行
-dimension フラグは、ビット数である 32 に設定します。
odpscmd -e "jar -resources proxima-ce-xl-222.jar -classpath ./proxima-ce-xl-222.jar com.alibaba.proxima2.ce.ProximaCERunner -doc_table cat_doc_table -doc_table_partition 20210712 -query_table cat_query_table -query_table_partition 20210712 -output_table cat_result_table -output_table_partition 20210712 -data_type binary -dimension 32 -app_id 201220 -category_row_num 2 -category_col_num 3 -topk 5 -category_thread_num 3 -category_threshold 100 -distance_method hamming;"
ステップ 3:結果の検証
すべて 1 のベクターであるクエリ key10-9 から key10-10 については、上位 5 件の結果にはハミング距離 0.0 の他のすべて 1 のベクターのみが含まれ、完全一致が最上位にランク付けされることを確認できます。結果は期待通りです:
+----+------------+-------+------------+----+
| pk | knn_result | score | category | pt |
+----+------------+-------+------------+----+
| key10-9 | key10-8 | 0.0 | 10 | 20210712 |
| key10-9 | key10-9 | 0.0 | 10 | 20210712 |
| key10-9 | key10-10 | 0.0 | 10 | 20210712 |
| key10-9 | key10-5 | 0.0 | 10 | 20210712 |
| key10-9 | key10-7 | 0.0 | 10 | 20210712 |
| key5-4 | key5-5 | 0.0 | 5 | 20210712 |
| key5-4 | key5-4 | 0.0 | 5 | 20210712 |
| key5-4 | key5-3 | 15.0 | 5 | 20210712 |
| key5-4 | key5-1 | 32.0 | 5 | 20210712 |
| key5-4 | key5-2 | 32.0 | 5 | 20210712 |
...
| key10-3 | key10-7 | 15.0 | 10 | 20210712 |
| key1-1 | key1-1 | 0.0 | 1 | 20210712 |
| key10-4 | key10-4 | 0.0 | 10 | 20210712 |
| key10-4 | key10-3 | 0.0 | 10 | 20210712 |
| key10-4 | key10-7 | 15.0 | 10 | 20210712 |
| key10-4 | key10-6 | 15.0 | 10 | 20210712 |
| key10-4 | key10-5 | 15.0 | 10 | 20210712 |
+----+------------+-------+------------+----+
ケース 5:すべて大カテゴリ(FLOAT、ユークリッド距離)
目的:ドキュメントテーブルに大カテゴリのみが存在する場合に、カテゴリ 20 および 30 の結果がケース 1 と一致することを検証します。
ステップ 1:データの準備
クエリーテーブルのデータはケース 1 と同じです。ドキュメントテーブルにはカテゴリ 20 および 30 のみが含まれます:
key20-1 1~1 20
key20-2 2~2 20
... ...
key20-19 19~19 20
key20-20 20~20 20
key30-1 1~1 30
key30-2 2~2 30
... ...
key30-28 28~28 30
key30-29 29~29 30
key30-30 30~30 30
ステップ 2:JAR コマンドの実行
odpscmd -e "jar -resources proxima-ce-xl-222.jar -classpath ./proxima-ce-xl-222.jar com.alibaba.proxima2.ce.ProximaCERunner -doc_table cat_doc_table -doc_table_partition 20210712 -query_table cat_query_table -query_table_partition 20210712 -output_table cat_result_table -output_table_partition 20210712 -data_type int8 -dimension 2 -app_id 201220 -category_row_num 2 -category_col_num 3 -topk 5 -category_thread_num 3 -category_threshold 15;"
ステップ 3:結果の検証
各クエリの上位 5 件の最近傍は、ケース 1 のカテゴリ 20 および 30 の結果と一致し、大カテゴリの並列処理が混合カテゴリの場合と同じ出力を生成することを確認できます。結果は期待通りです:
+----+------------+-------+------------+----+
| pk | knn_result | score | category | pt |
+----+------------+-------+------------+----+
| key30-1 | key30-1 | 0.0 | 30 | 20210712 |
| key30-1 | key30-2 | 2.0 | 30 | 20210712 |
| key30-1 | key30-3 | 8.0 | 30 | 20210712 |
| key30-1 | key30-4 | 18.0 | 30 | 20210712 |
| key30-1 | key30-5 | 32.0 | 30 | 20210712 |
| key30-2 | key30-2 | 0.0 | 30 | 20210712 |
| key30-2 | key30-3 | 2.0 | 30 | 20210712 |
| key30-2 | key30-1 | 2.0 | 30 | 20210712 |
| key30-2 | key30-4 | 8.0 | 30 | 20210712 |
| key30-2 | key30-5 | 18.0 | 30 | 20210712 |
... ...
| key20-1 | key20-1 | 0.0 | 20 | 20210712 |
| key20-1 | key20-2 | 2.0 | 20 | 20210712 |
| key20-1 | key20-3 | 8.0 | 20 | 20210712 |
| key20-1 | key20-4 | 18.0 | 20 | 20210712 |
| key20-1 | key20-5 | 32.0 | 20 | 20210712 |
... ...
| key20-5 | key20-5 | 0.0 | 20 | 20210712 |
| key20-5 | key20-6 | 2.0 | 20 | 20210712 |
| key20-5 | key20-4 | 2.0 | 20 | 20210712 |
| key20-5 | key20-7 | 8.0 | 20 | 20210712 |
| key20-5 | key20-3 | 8.0 | 20 | 20210712 |
+----+------------+-------+------------+----+
ケース 6:マルチラベルクエリ(FLOAT、ユークリッド距離)
目的:複数のカテゴリに割り当てられたクエリが、それぞれのカテゴリから独立して Top K の結果を返すことを検証します。
ステップ 1:データの準備
ドキュメントテーブルのデータはケース 1 と同じです。クエリーテーブルでは、最後のフィールドに複数のカテゴリ ID をカンマ区切りで指定するセミコロン区切りの形式を使用します:key;vector;category1,category2,...
key1-1;1~1;1,5,10
key1-2;2~2;1,5,10
key1-3;3~3;1
key1-4;4~4;1
key1-5;5~5;1
クエリ key1-1 および key1-2 はカテゴリ 1、5、および 10 に割り当てられています。クエリ key1-3 から key1-5 はカテゴリ 1 のみに割り当てられています。
ステップ 2:JAR コマンドの実行
odpscmd -e "jar -resources proxima-ce-xl-222.jar -classpath ./proxima-ce-xl-222.jar com.alibaba.proxima2.ce.ProximaCERunner -doc_table cat_doc_table -doc_table_partition 20210712 -query_table cat_query_table -query_table_partition 20210712 -output_table cat_result_table -output_table_partition 20210712 -data_type int8 -dimension 2 -app_id 201220 -category_row_num 2 -category_col_num 3 -topk 5 -category_thread_num 3 -category_threshold 15 -query_multi_label true;"
ステップ 3:結果の検証
key1-1(カテゴリ 1、5、および 10 に割り当て)に対して、出力には 3 つのカテゴリそれぞれからの Top K の結果が含まれます:key1-1(カテゴリ 1)、key5-1(カテゴリ 5)、および key10-1(カテゴリ 10)がそれぞれスコア 0.0(完全一致)で表示されます。1 つのカテゴリにのみ割り当てられたクエリ(key1-3 から key1-5)は、カテゴリ 1 のみから結果を返します。結果は期待通りです:
+----+------------+-------+------------+----+
| pk | knn_result | score | category | pt |
+----+------------+-------+------------+----+
| key1-1 | key1-1 | 0.0 | 1 | 20210712 |
| key1-1 | key5-1 | 0.0 | 5 | 20210712 |
| key1-1 | key10-1 | 0.0 | 10 | 20210712 |
| key1-1 | key10-2 | 2.0 | 10 | 20210712 |
| key1-1 | key5-2 | 2.0 | 5 | 20210712 |
| key1-2 | key5-2 | 0.0 | 5 | 20210712 |
| key1-2 | key10-2 | 0.0 | 10 | 20210712 |
| key1-2 | key5-3 | 2.0 | 5 | 20210712 |
| key1-2 | key5-1 | 2.0 | 5 | 20210712 |
| key1-2 | key10-1 | 2.0 | 10 | 20210712 |
| key1-3 | key1-1 | 8.0 | 1 | 20210712 |
| key1-4 | key1-1 | 18.0 | 1 | 20210712 |
| key1-5 | key1-1 | 32.0 | 1 | 20210712 |
+----+------------+-------+------------+----+