全部產品
Search
文件中心

OpenSearch:使用介紹

更新時間:Jul 13, 2024

自訂函數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.   |