QUERY 函数
引入或更新于:v1.2.830
QUERY 通过 Elasticsearch 风格查询表达式与具备倒排索引(Inverted Index)的列进行匹配,从而过滤行。使用点记法可导航 VARIANT 列中的嵌套字段。该函数仅在 WHERE 子句中生效。
信息
Databend 的 QUERY 函数灵感源自 Elasticsearch 的 QUERY。
语法
QUERY('<query_expr>'[, '<options>'])
<options> 为可选的分号分隔 key=value 对列表,用于调整搜索行为。
构建查询表达式
| 表达式 | 用途 | 示例 | 
|---|---|---|
| column:keyword | 匹配列中包含关键字的行,追加 *可实现后缀匹配。 | QUERY('meta.detections.label:pedestrian') | 
| column:"exact phrase" | 匹配包含精确短语的行。 | QUERY('meta.scene.summary:"vehicle stopped at red traffic light"') | 
| column:+required -excluded | 在同一列中要求或排除特定词项。 | QUERY('meta.tags:+commute -cyclist') | 
| column:term1 AND term2/column:term1 OR term2 | 使用布尔运算符组合多个词项, AND优先级高于OR。 | QUERY('meta.signals.traffic_light:red AND meta.vehicle.lane:center') | 
| column:IN [value1 value2 ...] | 匹配列表中的任意值。 | QUERY('meta.tags:IN [stop urban]') | 
| column:[min TO max] | 执行包含边界的范围搜索,用 *可开放一侧。 | QUERY('meta.vehicle.speed_kmh:[0 TO 10]') | 
| column:{min TO max} | 执行排除边界的范围搜索。 | QUERY('meta.vehicle.speed_kmh:{0 TO 10}') | 
| column:term^boost | 提升特定列中匹配的权重。 | QUERY('meta.signals.traffic_light:red^1.0 meta.tags:urban^2.0') | 
嵌套 VARIANT 字段
使用点记法访问 VARIANT 列内部字段,Databend 会跨对象与数组评估路径。
| 模式 | 描述 | 示例 | 
|---|---|---|
| variant_col.field:value | 匹配内部字段。 | QUERY('meta.signals.traffic_light:red') | 
| variant_col.field:IN [ ... ] | 匹配数组内任意值。 | QUERY('meta.detections.label:IN [pedestrian cyclist]') | 
| variant_col.field:[min TO max] | 对数值型内部字段执行范围搜索。 | QUERY('meta.vehicle.speed_kmh:[0 TO 10]') | 
选项
| 选项 | 取值 | 描述 | 示例 | 
|---|---|---|---|
| fuzziness | 1或2 | 匹配指定 Levenshtein 距离内的词项。 | SELECT id FROM frames WHERE QUERY('meta.detections.label:pedestrain', 'fuzziness=1'); | 
| operator | OR(默认)或AND | 未显式指定布尔运算符时控制多词项组合方式。 | SELECT id FROM frames WHERE QUERY('meta.scene.weather:rain fog', 'operator=AND'); | 
| lenient | true或false | 为 true时抑制解析错误并返回空结果集。 | SELECT id FROM frames WHERE QUERY('meta.detections.label:()', 'lenient=true'); | 
示例
构建智能驾驶数据集
CREATE OR REPLACE TABLE frames (
  id INT,
  meta VARIANT,
  INVERTED INDEX idx_meta (meta)
);
INSERT INTO frames VALUES
  (1, '{
         "frame":{"source":"dashcam_front","timestamp":"2025-10-21T08:32:05Z","location":{"city":"San Francisco","intersection":"Market & 5th","gps":[37.7825,-122.4072]}},
         "vehicle":{"speed_kmh":48,"acceleration":0.8,"lane":"center"},
         "signals":{"traffic_light":"green","distance_m":55,"speed_limit_kmh":50},
         "detections":[
           {"label":"car","confidence":0.96,"distance_m":15,"relative_speed_kmh":2},
           {"label":"pedestrian","confidence":0.88,"distance_m":12,"intent":"crossing"}
         ],
         "scene":{"weather":"clear","time_of_day":"day","visibility":"good"},
         "tags":["downtown","commute","green-light"],
         "model":"perception-net-v5"
       }'),
  (2, '{
         "frame":{"source":"dashcam_front","timestamp":"2025-10-21T08:32:06Z","location":{"city":"San Francisco","intersection":"Mission & 6th","gps":[37.7829,-122.4079]}},
         "vehicle":{"speed_kmh":9,"acceleration":-1.1,"lane":"center"},
         "signals":{"traffic_light":"red","distance_m":18,"speed_limit_kmh":40},
         "detections":[
           {"label":"traffic_light","state":"red","confidence":0.99,"distance_m":18},
           {"label":"bike","confidence":0.82,"distance_m":9,"relative_speed_kmh":3}
         ],
         "scene":{"weather":"clear","time_of_day":"day","visibility":"good"},
         "tags":["stop","cyclist","urban"],
         "model":"perception-net-v5"
       }'),
  (3, '{
         "frame":{"source":"dashcam_front","timestamp":"2025-10-21T08:32:07Z","location":{"city":"San Francisco","intersection":"SOMA School Zone","gps":[37.7808,-122.4016]}},
         "vehicle":{"speed_kmh":28,"acceleration":0.2,"lane":"right"},
         "signals":{"traffic_light":"yellow","distance_m":32,"speed_limit_kmh":25},
         "detections":[
           {"label":"traffic_sign","text":"SCHOOL","confidence":0.91,"distance_m":25},
           {"label":"pedestrian","confidence":0.76,"distance_m":8,"intent":"waiting"}
         ],
         "scene":{"weather":"overcast","time_of_day":"day","visibility":"moderate"},
         "tags":["school-zone","caution"],
         "model":"perception-net-v5"
       }');
示例:布尔 AND
SELECT id, meta['frame']['timestamp'] AS ts
FROM frames
WHERE QUERY('meta.signals.traffic_light:red AND meta.vehicle.speed_kmh:[0 TO 10]');
-- 返回 id 2
示例:布尔 OR
SELECT id, meta['frame']['timestamp'] AS ts
FROM frames
WHERE QUERY('meta.signals.traffic_light:red OR meta.detections.label:bike');
-- 返回 id 2
示例:IN 列表匹配
SELECT id, meta['frame']['timestamp'] AS ts
FROM frames
WHERE QUERY('meta.tags:IN [stop urban]');
-- 返回 id 2
示例:包含边界范围
SELECT id, meta['frame']['timestamp'] AS ts
FROM frames
WHERE QUERY('meta.vehicle.speed_kmh:[0 TO 10]');
-- 返回 id 2
示例:排除边界范围
SELECT id, meta['frame']['timestamp'] AS ts
FROM frames
WHERE QUERY('meta.vehicle.speed_kmh:{0 TO 10}');
-- 返回 id 2
示例:跨字段权重提升
SELECT id, meta['frame']['timestamp'] AS ts, SCORE()
FROM frames
WHERE QUERY('meta.signals.traffic_light:red^1.0 AND meta.tags:urban^2.0');
-- 返回 id 2,相关性更高
示例:检测高置信度行人
SELECT id, meta['frame']['timestamp'] AS ts
FROM frames
WHERE QUERY('meta.detections.label:IN [pedestrian cyclist] AND meta.detections.confidence:[0.8 TO *]');
-- 返回 id 1 和 3
示例:按短语过滤
SELECT id, meta['frame']['timestamp'] AS ts
FROM frames
WHERE QUERY('meta.scene.summary:"vehicle stopped at red traffic light"');
-- 返回 id 2
示例:学区过滤
SELECT id, meta['frame']['timestamp'] AS ts
FROM frames
WHERE QUERY('meta.detections.text:SCHOOL AND meta.scene.time_of_day:day');
-- 返回 id 3

