自定义函数UDF的相关使用说明。
UDF列表
函数名 | 功能简介 |
判断字段值在给定集合内,支持单值和多值 | |
判断字段值不在给定集合内,支持单值和多值 | |
使用给定的条件查询指定字段的倒排索引 | |
使用给定的条件查询倒排索引, 原HA3 query语法 | |
将多个int64的值合并成1个int64的值 | |
按范围将字段值做映射 | |
判断字段值在给定区间内 | |
对字段值作规整 |
检索示例
检索全表内容
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(INT a, const string b) boolean contain(LITERAL a, const string b) boolean contain(INT_ARRAY a, const string b) boolean contain(LITERAL_ARRAY a, const string b)
说明
判断单值或多值a中是否包含b中描述的内容
参数
参数a:输入为INT/LITERAL /INT_ARRAY/LITERAL_ARRAY类型
参数b:输入为常量string表达式,用
|
分隔,表示满足任意一项即可返回值
boolean类型返回,表示参数a是否包含参数b中描述的集合
示例
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(INT a, const string b) boolean notcontain(LITERAL a, const string b) boolean notcontain(INT_ARRAY a, const string b) boolean notcontain(LITERAL_ARRAY a, const string b)
说明
判断单值或多值a中是否不在b中描述的内容
参数
参数a:输入为INT/LITERAL /INT_ARRAY/LITERAL_ARRAY类型
参数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)
说明
判断字段a中是否包含b中描述的内容,单字段索引的召回
仅限索引表召回阶段倒排加速优化使用,用于where条件中
参数
参数a:输入为常量string 类型,对应建立倒排优化字段
参数b:输入为常量string 类型,内容为字符串描述内容,
参数b可作为一个string整体查询
返回值
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)
说明
判断字段a中是否包含b中描述的内容,提供自动分词并检索能力,
用于支持在SQL模式下使用HA3引擎原生的查询语法ha3 query语法,
仅限索引表召回阶段倒排加速优化使用,用于where条件中
参数
参数a:输入为常量string 类型,会作为默认索引字段
参数b:输入为常量string 类型,内容为字符串描述内容
会拼到query解析中,可用于range索引
返回值
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 |
备注:
QUERY udf的参数2是通过HA3 query语法解析器解析的,HA3 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手机''')。SQL描述中常量字符串的使用注意事项,可参考 [使用限制] 的'常量字符串'部分。
典型错误:
错误类型 | 错误形式 | 正确形式 |
语法报错,查询无结果 | QUERY('pidvid','123:456') | QUERY('pidvid','"123:456"') |
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;
range
原型
boolean range(INT v, const string rangeDesc) boolean range(FLOAT v, const string rangeDesc) boolean range(DOUBLE v, const string rangeDesc)
说明
判断正排字段值是否在某一个区间
参数
参数v:字段,支持单值数值类型
参数rangeDesc:常量,描述数值范围区间,支持开、闭与半开半闭区间
返回值
判断v是否在rangeDesc描述范围内,下表为支持的写法及返回值
调用写法示例 | 返回值 |
range(v, "[0, 100]") | 0<=v<=100 |
range(v, "(0, 100)") | 0<v<100 |
range(v, "[0, 100)") | 0<=v<100 |
range(v, "(0, 100]") | 0<v<=100 |
range(v, "(0,)") range(v, "(0,]") | 0<v |
range(v, "[0,)") range(v, "[0,]") | 0<=v |
range(v, "(,100)") range(v, "[,100)") | v<100 |
range(v, "(,100]") range(v, "[,100]") | v<=100 |
range(v, "(,)") range(v, "[,]") range(v, "[,)") range(v, "(,]") | true |
注意:rangeDesc还支持用"!"符号写于行首,表示对意向区间取反
示例
使用
range
SELECT nid FROM phone where range(price,"(127.0,30.0)") SELECT nid FROM phone where range(price,"!(127.0,30.0)")
注意:range 是sql保留关键字 ,需要进行转义
normalizescore
原型
double normalizescore(INT v, const double defaultScore) double normalizescore(FLOAT v, const double defaultScore) double normalizescore(DOUBLE v, const double defaultScore)
说明
对入参字段v作规整化处理,转换为double类型,已初始化返回原值,未初始化返回defaultScore
参数
参数v:字段,支持单值数值类型
参数defaultScore:常量描述,必须为能转换为合法double类型的字符串
返回值
v若已初始化返回原值,未初始化返回defaultScore
示例
对于拥有字段price的3个doc,原始内容如下:
doc1: price=1.0
doc2: price= (未初始化)
doc3: price=2.0
执行
select normalizescore(price, "1000.0") as normalized_score from phone
USE_TIME: 32.141ms, ROW_COUNT: 2
------------------------------- TABLE INFO ---------------------------
normalized_score(double) |
1.0 |
1000.0 |
2.0. |