本文介绍如何在 EMR Serverless StarRocks 中通过 DLF Catalog 查询已创建 Global Index 的 Paimon 表。
前提条件
-
实例版本:已创建 EMR Serverless StarRocks 3.5.16-2.2.3 或以上版本的实例。
-
地域要求:StarRocks 实例与 DLF Catalog 位于同一地域。
-
权限配置:已为连接 StarRocks 的 RAM 用户授予DLF的API权限和目标 DLF Catalog、数据库和表的查询权限。具体操作,请参见快速配置权限。
-
网络配置:StarRocks 实例所在的 VPC 已加入 DLF 可信名单。具体操作,请参见可信 VPC 配置。
-
索引状态:目标 Paimon 表的 Global Index 已构建,详见构建 Global Index 实现查询加速和向量搜索。
使用限制
-
组合查询:组合使用标量条件和数组元素条件时,不保证两个索引同时参与查询。
-
样例数据:DLF 共享样例 Catalog 为只读,仅用于体验已有索引,不用于创建业务索引。共享样例表不保证已创建 Bitmap 或多值索引。
注意事项
-
查询连接:参数
paimon_global_index_scan_stage仅对当前连接生效。更换连接后,需要重新设置该参数。 -
生效判断:查询 Paimon
table_indexes系统表只能确认索引已经提交,不能单独证明查询命中了索引。当前版本的EXPLAIN仅显示PaimonScanNode,是否加速需结合 Query Profile 中的扫描和过滤指标以及实际耗时判断。
准备 StarRocks 环境
如需准备共享样例表,请参见使用 DLF 共享样例数据集。
注册 DLF Catalog
在 EMR Serverless StarRocks 的 SQL Editor 中注册指向目标 DLF Paimon Catalog 的 External Catalog:
CREATE EXTERNAL CATALOG `dlf_samples`
PROPERTIES (
'type' = 'paimon',
'uri' = 'http://cn-hangzhou-vpc.dlf.aliyuncs.com',
'paimon.catalog.type' = 'rest',
'paimon.catalog.warehouse' = 'dlf_samples',
'token.provider' = 'dlf'
);
参数说明:
-
uri:http://<vpc_endpoint>,其中<vpc_endpoint>为 StarRocks 实例所在地域的 DLF VPC Endpoint。各地域的 Endpoint,请参见地域与服务接入点。 -
paimon.catalog.warehouse:替换为目标 DLF Catalog Name。
具体操作,请参见使用 DLF Catalog。
开启分布式 Global Index 查询
在执行查询的连接中运行以下命令:
SET paimon_global_index_scan_stage = 2;
设置为 2 后,StarRocks 会先分布式读取 Global Index,再按 Row ID 读取 Paimon 数据。
快速入门
本节使用 DLF 共享样例表体验 B-tree 查询、IVF-PQ 相似图片检索和混合检索。Bitmap 和多值索引查询需要使用已构建相应 Global Index 的自建 Paimon 表。
查看共享样例表的 Global Index
查询 Paimon table_indexes 系统表,确认 B-tree 和 IVF-PQ 索引已经提交:
SELECT
index_type,
index_field_name,
COUNT(*) AS index_file_count,
SUM(row_count) AS indexed_rows
FROM `dlf_samples`.`search_samples`.`berkeley_deepdrive_100k_images$table_indexes`
WHERE index_type IN ('btree', 'ivf-pq')
GROUP BY index_type, index_field_name
ORDER BY index_type, index_field_name;
查询结果应包含 weather 字段的 B-tree 索引和 image_embedding 字段的 IVF-PQ 索引,且 indexed_rows 大于 0。
使用 B-tree 按天气查询
查询 rainy 天气的图片:
SELECT
image_id,
event_time,
weather,
time_of_day,
road_scene,
detected_objects
FROM `dlf_samples`.`search_samples`.`berkeley_deepdrive_100k_images`
WHERE weather = 'rainy'
LIMIT 20;
使用 IVF-PQ 查询相似图片
先从样例表读取一张图片的向量到会话变量,再执行 Top 10 查询,无需展开向量内容:
SET paimon_global_index_scan_stage = 2;
SET @query_vector = (
SELECT image_embedding
FROM `dlf_samples`.`search_samples`.`berkeley_deepdrive_100k_images`
WHERE image_id = 'b6d82c09-e7005951'
LIMIT 1
);
SELECT
image_id,
event_time,
weather,
time_of_day,
road_scene,
detected_objects,
approx_inner_product(image_embedding, @query_vector) AS score
FROM `dlf_samples`.`search_samples`.`berkeley_deepdrive_100k_images`
ORDER BY score DESC
LIMIT 10;
score 越大表示越相似。评分函数和排序方向必须与索引的距离度量一致。本示例使用内积和降序排列。
使用 B-tree 和 IVF-PQ 进行混合检索
复用上一步的 @query_vector,增加天气条件,同时使用 B-tree 和 IVF-PQ:
SELECT
image_id,
weather,
approx_inner_product(image_embedding, @query_vector) AS score
FROM `dlf_samples`.`search_samples`.`berkeley_deepdrive_100k_images`
WHERE weather = 'rainy'
ORDER BY score DESC
LIMIT 10;
使用 Bitmap 和多值索引查询
以下示例使用已创建 Bitmap 和多值索引的自建 Paimon 表。请将 <catalog_name>、<database_name> 和 <table_name> 替换为实际名称,并先查询 table_indexes 系统表,确认 time_of_day 字段的 Bitmap 索引和 detected_objects 字段的多值索引已构建,且 indexed_rows 大于 0:
SELECT
index_type,
index_field_name,
COUNT(*) AS index_file_count,
SUM(row_count) AS indexed_rows
FROM `<catalog_name>`.`<database_name>`.`<table_name>$table_indexes`
GROUP BY index_type, index_field_name
ORDER BY index_type, index_field_name;
按低基数字段筛选夜间图片:
SELECT image_id, event_time, time_of_day, detected_objects
FROM `<catalog_name>`.`<database_name>`.`<table_name>`
WHERE time_of_day = 'night'
LIMIT 20;
筛选 detected_objects 数组中包含完整元素 car 的图片:
SELECT image_id, event_time, time_of_day, detected_objects
FROM `<catalog_name>`.`<database_name>`.`<table_name>`
WHERE array_contains(detected_objects, 'car')
LIMIT 20;
组合标量条件与数组元素条件:
SELECT image_id, event_time, time_of_day, detected_objects
FROM `<catalog_name>`.`<database_name>`.`<table_name>`
WHERE time_of_day = 'night'
AND array_contains(detected_objects, 'car')
LIMIT 20;
array_contains 表示数组元素匹配,不是字符串子串匹配。函数可以执行与谓词能够下推到 Paimon 是两项不同的能力,SQL 执行成功不能单独证明多值索引已生效。
确认当前连接的 paimon_global_index_scan_stage 为 2,再结合 Query Profile 中的扫描、过滤指标和实际耗时判断。EXPLAIN 仅出现 PaimonScanNode 不能作为命中索引的证据。本节 SQL 未在该部署环境中实际执行。
传递向量查询参数
可按需通过 ann_params 调整 IVF-PQ 查询参数。例如,运行以下命令设置 nprobe:
SET ann_params = '{"nprobe":"32"}';
nprobe 越大,通常召回率越高,查询开销也越大。未设置时使用当前版本的默认值。测试后可运行以下命令清空参数:
SET ann_params = '';
关于 IVF-PQ 的构建参数、查询参数和调优建议,请参见配置 IVF-PQ 构建和查询参数。
验证 Global Index 是否生效
确认 paimon_global_index_scan_stage 为 2。当前版本的 EXPLAIN 只显示 PaimonScanNode,是否加速应结合实际耗时和 Query Profile 判断。
SHOW VARIABLES LIKE 'paimon_global_index_scan_stage';
如未按预期加速,请先确认索引已提交、paimon_global_index_scan_stage 为 2,并检查向量维度、评分函数和排序方向是否与索引一致。
更多关于 StarRocks 湖表向量检索的原理、缓存和排查方法,请参见DLF Paimon 表向量检索。