Skip to content

UDF使用介绍

yuyang edited this page Nov 25, 2022 · 12 revisions

UDF 使用介绍

内置UDF列表

复杂类型函数

函数名 功能简介 版本
contain 判断字段值在给定集合内,支持单值和多值 ALL
notcontain 判断字段值不在给定集合内,支持单值和多值 ALL
MATCHINDEX 使用给定的条件查询指定字段的倒排索引 ALL
QUERY 使用给定的条件查询倒排索引, 原HA3 query语法 ALL
sp_query_match 根据sp语法描述的条件查询倒排索引 >=3.7.5
hashcombine 将多个int64的值合并成1个int64的值 >=3.7.5
rangevalue 按范围将字段值做映射 >=3.7.5
sphere_distance 计算经纬度距离 >=3.7.5
ha_in 判断字段值在给定集合内 >=3.7.5

使用示例

检索示例

  • 检索全表内容
SELECT nid, price, brand, size FROM phone ORDER BY nid LIMIT 1000 
USE_TIME: 0.881, ROW_COUNT: 10

------------------------------- TABLE INFO ---------------------------
                 nid |               price |               brand |                size |
                   1 |                3599 |              Huawei |                 5.9 |
                   2 |                4388 |              Huawei |                 5.5 |
                   3 |                 899 |              Xiaomi |                   5 |
                   4 |                2999 |                OPPO |                 5.5 |
                   5 |                1299 |               Meizu |                 5.5 |
                   6 |                 169 |               Nokia |                 1.4 |
                   7 |                3599 |               Apple |                 4.7 |
                   8 |                5998 |               Apple |                 5.5 |
                   9 |                4298 |               Apple |                 4.7 |
                  10 |                5688 |             Samsung |                 5.6 |

contain

  • 原型
boolean contain(int32 a, const string b)
boolean contain(int64 a, const string b)
boolean contain(string a, const string b)
boolean contain(ARRAY<int32> a, const string b)
boolean contain(ARRAY<int64> a, const string b)
boolean contain(ARRAY<string> a, const string b)
  • 说明

判断单值或多值a中是否包含b中描述的内容

  • 参数

参数a:输入为单值多值的int32/int64/string 类型
参数b:输入为常量string表达式,用 | 分隔,表示满足任意一项即可

  • 返回值

boolean类型返回,表示参数a是否包含参数b中描述的集合

  • 示例

使用 contain ,检索nid字段值在[1,2,3]的所有记录

SELECT nid, price, brand, size FROM phone WHERE contain(nid, '1|2|3') ORDER BY nid LIMIT 100
USE_TIME: 0.059, ROW_COUNT: 3

------------------------------- TABLE INFO ---------------------------
                 nid |               price |               brand |                size |
                   1 |                3599 |              Huawei |                 5.9 |
                   2 |                4388 |              Huawei |                 5.5 |
                   3 |                 899 |              Xiaomi |                   5 |

notcontain

  • 原型
boolean notcontain(int32 a, const string b)
boolean notcontain(int64 a, const string b)
boolean notcontain(string a, const string b)
boolean notcontain(ARRAY<int32> a, const string b)
boolean notcontain(ARRAY<int64> a, const string b)
boolean notcontain(ARRAY<string> a, const string b)
  • 说明

判断单值或多值a中是否不在b中描述的内容

  • 参数

参数a:输入为单值多值的int32/int64/string 类型
参数b:输入为常量string表达式,用 | 分隔,表示不能满足任意一项

  • 返回值

boolean类型返回,表示参数a是否不在参数b中描述的集合

  • 示例

使用 notcontain ,检索nid字段值不在[1,2,3]范围内的所有记录

SELECT nid, price, brand, size FROM phone WHERE notcontain(nid, '1|2|3') ORDER BY nid LIMIT 100
USE_TIME: 0.092, ROW_COUNT: 7

------------------------------- TABLE INFO ---------------------------
                 nid |               price |               brand |                size |
                   4 |                2999 |                OPPO |                 5.5 |
                   5 |                1299 |               Meizu |                 5.5 |
                   6 |                 169 |               Nokia |                 1.4 |
                   7 |                3599 |               Apple |                 4.7 |
                   8 |                5998 |               Apple |                 5.5 |
                   9 |                4298 |               Apple |                 4.7 |
                  10 |                5688 |             Samsung |                 5.6 |

MATCHINDEX

  • 原型
boolean MATCHINDEX(const string a, const string b)
boolean MATCHINDEX(const string a, const string b, const string c)
  • 说明

判断字段a中是否包含b中描述的内容,单字段索引的召回
仅限索引表召回阶段倒排加速优化使用,用于where条件中

  • 参数

参数a:输入为常量string 类型,对应建立倒排优化字段
参数b:输入为常量string 类型,内容为字符串描述内容,
参数b可作为一个string整体查询,可用于空间向量索引
参数c:可选项,可描述内容包含分词器,停用词等,用于b中内容的分词:
主要通过下以关键词设置:
使用: , 分隔每一项

  - global_analyzer
  - specific_index_analyzer
  - no_token_indexes
  - tokenize_query
  - remove_stopwords
  - default_op
  • 返回值

boolean类型返回,表示字段a中是否含有参数b中描述的内容

  • 示例

使用 MATCHINDEX ,检索倒排字段 title 中含有"镜头"关键字的记录

SELECT nid, brand FROM phone WHERE MATCHINDEX('title', '镜头')
------------------------------- TABLE INFO ---------------------------
                 nid |               brand |
                   1 |              Huawei |

QUERY

  • 原型
boolean QUERY(const string a, const string b)
boolean QUERY(const string a, const string b, const string c)
  • 说明

判断字段a中是否包含b中描述的内容,提供自动分词并检索能力,
用于支持在SQL模式下使用HA3引擎原生的查询语法ha3 query语法
仅限索引表召回阶段倒排加速优化使用,用于where条件中

  • 参数

参数a:输入为常量string 类型,会作为默认索引字段,default_index
参数b:输入为常量string 类型,内容为字符串描述内容
会拼到query解析中,可用于range索引
参数c:可选项,可描述内容包含分词器,停用词等,用于b中内容的分词:
使用: , 分隔每一项
主要通过下以关键词设置:

  - global_analyzer
  - specific_index_analyzer
  - no_token_indexes
  - tokenize_query
  - remove_stopwords
  - default_op
  • 返回值

boolean类型返回,表示字段a中是否含有参数b中描述的内容

  • 示例
    • 使用 QUERY ,查询 title 中含有"Huawei手机"的条目。
SELECT nid, price, brand, size FROM phone WHERE QUERY(title, 'Huawei手机')
USE_TIME: 0.034, ROW_COUNT: 1

------------------------------- TABLE INFO ---------------------------
                 nid |               price |               brand |                size |
                   2 |                4388 |              Huawei |                 5.5 |
  • 使用组合条件,检索title中含有 "Huawei手机" 或者 "OPPO手机" 条目
SELECT nid, price, brand, size FROM phone 
   WHERE QUERY(title, 'Huawei手机 OR OPPO手机')
USE_TIME: 0.03, ROW_COUNT: 2

------------------------------- TABLE INFO ---------------------------
                 nid |               price |               brand |                size |
                   2 |                4388 |              Huawei |                 5.5 |
                   4 |                2999 |                OPPO |                 5.5 |
  • 指定default_op等用法,使用: , 分隔
SELECT nid, price, brand, size FROM phone 
   WHERE QUERY(title, 'Huawei手机 OPPO手机', 'default_op:OR,remove_stopwords:true')
  • 备注

QUERY udf的参数2是通过HA3 query语法解析器解析的,HA3 query语法可以参考 [query子句] 一节。当参数2填入的是常量字符串,代入HA3 query需要注意将前后单引号去掉,如QUERY(title, 'Huawei手机 OPPO手机')等价于HA3查询query=Huawei手机 OPPO手机。如果需要在query描述内部加引号,如形为query='Huawei手机' AND 'OPPO手机' 的HA3查询串,QUERY udf中的等价形式为 QUERY(title, '''Huawei手机'' AND ''OPPO手机''')。

  • 典型错误 | 错误类型 | 错误形式 | 正确形式 | | --- | --- | --- | | 语法报错,查询无结果 | QUERY('pidvid','123:456') | QUERY('pidvid','"123:456"') |

sp_query_match

  • 原型
boolean sp_query_match(string a)
  • 说明

使用sp的查询语法检索倒排索引

  • 参数

参数a:sp格式的查询串

  • 返回值

  • 示例

使用sp_query_match,检索brand是Apple且nid等于6或7或8的记录

SELECT * FROM phone WHERE sp_query_match('brand:Apple+(nid:6|nid:7|nid:8'))

hashcombine

  • 原型
int64 hashcombine(int64 k1, int64 k2, ...)
  • 说明

将多个int64整数通过内置hash函数合并成1个int64

  • 参数

多个int64的整数列

  • 返回值

hash后的值

  • 示例

使用hashcombine,将cate_id和user_id合并成一个值

SELECT hashcombine(cate_id,user_id) FROM phone;

rangevalue

  • 原型
float rangevalue(float v, string desc)
  • 说明

将连续值映射成离散值

  • 参数

参数v:连续值的列
参数desc:映射规则

  • 返回值

映射后的离散值

  • 示例

使用rangevalue,对price的值做映射:小于等于1000映射为1.0,大于1000小于等于5000映射为2.0,其他保留原始价格值

SELECT rangevalue(price,'(,1000]:1.0;(1000,5000]:2.0') FROM phone;

sphere_distance

  • 原型
double sphere_distance(LOCATION point, double longitude, double latitude)
  • 说明

计算输入的经纬度和检索文档的距离

  • 参数

参数point:LOCATION类型单值的列
参数longitude:经度
参数latitude:纬度

  • 返回值

地球球面距离,单位为千米

  • 示例

使用sphere_distance。geo必须是LOCATION类型单值字段且创建了正排

SELECT sphere_distance(geo,127.0,30.0) FROM phone

ha_in

  • 原型
boolean ha_in(int32 v, const string desc, [const string sep])
boolean ha_in(ARRAY<int32> v, const string desc, [const string sep])
boolean ha_in(int64 v, const string desc, [const string sep])
boolean ha_in(ARRAY<int64> v, const string desc, [const string sep])
boolean ha_in(string v, const string desc, [const string sep])
boolean ha_in(ARRAY<string> v, const string desc, [const string sep])
  • 说明

类似contain的用法,判断描述内容是否存在于v字段中,可以用于summary/kv/kkv表查询

  • 参数

参数v:字段,支持单值多值类型
参数desc:常量描述,可表述多个项,v满足其中一项即可
参数sep:可选项,分隔符,拆个参数desc内容成多项,默认|

  • 返回值

判断v是否满足desc描述

  • 示例

使用ha_in,检索nid字段值在描述里的所有记录

select nid from mainse_excellent_search where ha_in(nid, '641999912989|577150359640|123456')
USE_TIME: 32.141ms, ROW_COUNT: 2

------------------------------- TABLE INFO ---------------------------
                  nid(int64) |
                641999912989 |
                577150359640 |

附录:

分词器描述:

用于MATCHINDEX,QUERY等使用的参数说明

查询中指定全局的分词器,该分词器会覆盖schema的分词器,指定的值必须在analyzer.json里有配置

查询中指定index使用另外的分词器,该分词器会覆盖global_analyzer和schema的分词器

支持查询中指定的index不分词(除分词以外的其他流程如归一化、去停用词会正常执行),
多个index之间用;分割

  • tokenize_query

true or false 表示是否需要对query进行分词,QUERY UDF带了分词器该参数不生效
默认true

  • remove_stopwords

true or false 表示是否需要删除stop words,stop words在分词器中配置
默认true

指定在该次查询中使用的默认query 分词后的连接操作符,AND or OR, 默认行为在biz中配置

第三方UDF列表

复杂类型函数

函数名 功能简介 版本
type cast cast类型 ALL
Clone this wiki locally