使用介绍

自定义函数UDF的相关使用说明。

UDF列表

函数名

功能简介

contain

判断字段值在给定集合内,支持单值和多值

notcontain

判断字段值不在给定集合内,支持单值和多值

MATCHINDEX

使用给定的条件查询指定字段的倒排索引

QUERY

使用给定的条件查询倒排索引, 原HA3 query语法

hashcombine

将多个int64的值合并成1个int64的值

rangevalue

按范围将字段值做映射

range

判断字段值在给定区间内

normalizescore

对字段值作规整

检索示例

检索全表内容

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.   |