自訂函數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 100USE_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 100USE_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還支援用"!"符號寫於行首,表示對意向區間取反
樣本
使用
rangeSELECT 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. |