本文为您介绍多类目测试的结论及测试过程。
测试结论
Proxima CE对于多类目场景的按类目检索、类目多标签检索符合预期。
测试过程
- 测试方法。
- case1: 生成一批多类目数据,各类目对应的文档数量为1、5、10、20、30,query数据中各类目对应的数量为5、10、20、 5、10,类目阈值假定为15,小类目的行数为2,列数为3,大类目并发度为3,topk为5,数据类型为float,维数2,距离为欧式距离, 验证最终的结果数目,以及正确性。
各类目对应的文档数量 query数据中各类目对应的数量 类目阈值 小类目的行数 小类目的列数 大类目并发度 TopK 数据类型 维度 距离 1、5、10、20、30 5、10、20、5、10 15 2 3 3 5 FLOAT 2 欧式距离 - case2: 只有小类目,没有大类目时,正确性验证。数据是上面case1的数据,CATEGORY_THREASHOLD默认就是100万,也就是只有小类目。距离为计算欧式距离。
各类目对应的文档数量 query数据中各类目对应的数量 类目阈值 小类目的行数 小类目的列数 大类目并发度 TopK 数据类型 维度 距离 1、5、10、20、30 5、10、20、5、10 100W 2 3 - 5 FLOAT 2 欧式距离 - case3: 和case2一致,距离为计算内积。
各类目对应的文档数量 query数据中各类目对应的数量 类目阈值 小类目的行数 列数 大类目并发度 TopK 数据类型 维度 距离 1、5、10、20、30 5、10、20、5、10 100W 2 3 - 5 FLOAT 2 计算内积 - case4: 只有小类目,没有大类目,文档数量为1、5、10,query数量1、5、10,数据类型是binary,距离为hamming距离。验证最终结果数目,以及正确性。类目阈值1000000。
各类目对应的文档数量 query数据中各类目对应的数量 类目阈值 小类目的行数 小类目的列数 大类目并发度 TopK 数据类型 维度 距离 1、5、10 1、5、10 1000000 2 3 - 5 BINARY 4 Hamming距离 - case5: 只有大类目,没有小类目时,正确性验证。数据是上面case1的数据,去掉类目1,5,10。
各类目对应的文档数量 query数据中各类目对应的数量 类目阈值 大类目的行数 列数 大类目并发度 TopK 数据类型 维度 距离 20、30 5、10 15 2 3 3 5 FLOAT 2 欧式距离 - case6: query为multicategory多类目,doc数据和case1一致。
各类目对应的文档数量 query数据中各类目对应的数量 类目阈值 小类目的行数 列数 大类目并发度 TopK 数据类型 维度 距离 1、5、10、20、30 multicategory数据 15 2 3 3 5 FLOAT 2 欧式距离
- case1: 生成一批多类目数据,各类目对应的文档数量为1、5、10、20、30,query数据中各类目对应的数量为5、10、20、 5、10,类目阈值假定为15,小类目的行数为2,列数为3,大类目并发度为3,topk为5,数据类型为float,维数2,距离为欧式距离, 验证最终的结果数目,以及正确性。
- 对比测试。
- Case1:输入数据:类目1、5、10、20、30对应的文档数分别为1、5、10、20、30,query数据中类目1、5、10、20、30对应的query数目分别为5、10、20、5和10。数据类型为float,维数为2。距离为欧式距离。
- 数据准备。
各类目数据生成规则为
key+类目id-idx,idx~idx,类目id
,例如:key1-1,1~1,1
。doc数据如下: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
query数据如下: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
- 运行结果。将类目阈值假定为15,小类目的行数为2,列数为3,大类目并发度为3,topn为5,则小类目数目为3,大类目数目为2,观察最终执行结果如下,符合预期。
+----+------------+-------+------------+----+ | 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 | 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;
- 数据准备。
- Case2: 所有类目都是小类目,计算欧式距离,预期结果和case1的结果一致。
- 数据准备:与case1一致。
- 运行结果。预期结果和case1的结果一致,经过验证,符合预期。结果如下:
+----+------------+-------+------------+----+ | 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 | +----+------------+-------+------------+----+ 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 100;"
- Case3: 输入数据和case2一致,区别在于case3距离为计算内积。
- 数据准备:和case1一致。
- 运行结果:符合预期。结果如下:
+----+------------+-------+------------+----+ | 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 | +----+------------+-------+------------+----+ 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;"
- Case4: 输入数据:类目1、5、10对应的文档数分别为1、5、10,query数据中类目1、5、10。对应的query数目分别为1、5、10。数据类型为binary,维数为4。距离为欧式距离。doc和query的数据一致。
- 数据准备。
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
- 运行结果:符合预期。结果如下:
+----+------------+-------+------------+----+ | 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 | +----+------------+-------+------------+----+ 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 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;"
- 数据准备。
- Case5: 所有类目都是大类目,预期结果和case1的结果一致,经过验证,符合预期。大类目的阈值是15,query和case1数据一致。doc数据将类目1、5、10去掉,只保留20、30。doc_table数据如下。
- 数据准备。query数据和case1一致,doc数据如下:
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
- 运行结果:符合预期。结果如下:
+----+------------+-------+------------+----+ | 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 | +----+------------+-------+------------+----+ 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;"
- 数据准备。
- Case6: query为multicategory数据,doc数据和case1一致,数据如下。
- 数据准备。doc数据和case1一致,query数据如下:
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
- 运行结果:符合预期。结果如下:
+----+------------+-------+------------+----+ | 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 | +----+------------+-------+------------+----+ 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;"
- 数据准备。
- Case1:输入数据:类目1、5、10、20、30对应的文档数分别为1、5、10、20、30,query数据中类目1、5、10、20、30对应的query数目分别为5、10、20、5和10。数据类型为float,维数为2。距离为欧式距离。