filter子句
子句說明
過濾功能支持用戶根據(jù)查詢條件,篩選出用戶感興趣的文檔。會在通過query子句查找到的文檔進(jìn)行進(jìn)一步的過濾,以返回最終所需結(jié)果。
語法說明
過濾條件格式為:field=value
過濾條件支持>、<、=、<=、>=、!=、in/notin 等常見條件運(yùn)算符;以及+、-、*、/、&、^、| 等算術(shù)運(yùn)算符;
過濾條件可以配置多個,通過AND、OR及()的邏輯運(yùn)算關(guān)系(必須大寫!)進(jìn)行連接。
注意事項
filter為非必選子句。
在filter中出現(xiàn)的字段必須在定義應(yīng)用結(jié)構(gòu)的時候配置為屬性字段。
FLOAT、DOUBLE類型因為精度問題無法做精確相等的判斷,如有這種場景請改用>和<來實(shí)現(xiàn)。
LITERAL類型的字段值,在filter子句中必須要使用雙引號(否則會報錯:6135,常量表達(dá)式類型錯誤),支持所有的關(guān)系運(yùn)算,不支持算術(shù)運(yùn)算。
排序功能——功能函數(shù)項中的函數(shù),可以在filter子句中使用;如:distance函數(shù)。
LITERAL類型字段的過濾僅支持=、!=運(yùn)算,含義為等于、不等于,不支持>、<等關(guān)系運(yùn)算。(LITERAL字段類型不分詞,需要完全匹配)
in/notin 判斷字段值是否(不)在指定列表中,支持INT、LITERAL及FLOAT、DOUBLE類型,( 不支持ARRAY、TEXT、模糊分詞系列類型 ),詳細(xì)用法參考 in和notin。
分詞字段類型無法配置為屬性,例如 TEXT,SHORT_TEXT等都不支持,只支持?jǐn)?shù)值字段類型及不分詞字段類型配置為屬性,例如INT,INT_ARRAY,F(xiàn)LOAT,F(xiàn)LOAT_ARRAY,DOUBLE,DOUBLE_ARRAY,LITERAL,LITERAL_ARRAY這些字段類型都支持。
功能性函數(shù)使用
distance: 獲取兩個點(diǎn)之間的球面距離。一般用于LBS的距離計算。
舉例:
查找距離用戶(120.34256,30.56982)10公里內(nèi)的外婆家(lon,lat為文檔中記錄商家的經(jīng)緯度值,需要配置為屬性字段):
query=default:'外婆家'&&filter=distance(lon,lat,"120.34256","30.56982")
in_polygon: 判斷某個點(diǎn)是否在某個多邊形范圍內(nèi),一般用于配送范圍判斷
舉例:
判斷用戶是否在商家的配送范圍。如商家配送范圍的字段為coordinates, 用戶位置坐標(biāo)為 (120.307234, 39.294245),過濾在配送范圍內(nèi)的商家:
query=default:'美食'&&filter=in_polygon(coordinates, 120.307234, 39.294245)>0
in_query_polygon: 判斷文檔中指定的點(diǎn)是否在用戶指定的多邊形范圍內(nèi)
舉例:
搜索銀泰商圈(xA,yA,xB,Yb,xC,Yc;xD,yD,xE,yE,xF,yF,xG,yG)的外婆家,商家位置存放在point字段中
query=default:'外婆家'&&filter=in_query_polygon("polygons",point)>0&&kvpairs=polygons:xA\,yA\,xB\,Yb\,xC\,Yc;xD\,yD\,xE\,yE\,xF\,yF\,xG\,yG
bit_struct: 將INT_ARRAY字段值進(jìn)行自定義分組并允許對分組值進(jìn)行指定operation計算
舉例:
查詢給定時間段在營業(yè)的店鋪有哪些? 假定用戶文檔中有一個int64_array類型的字段open_time,每個值表示一段營業(yè)時間,將int64的高32位表示起始時間,低32位表示結(jié)束時間,如果要查詢下午14點(diǎn)到15:30點(diǎn)營業(yè)的店鋪,可以將時間轉(zhuǎn)換為從當(dāng)天0點(diǎn)開始,按分鐘為單位的時間段, 則下午14點(diǎn)到15:30表示為(840,930):
filter=bit_struct(open_time, "0-31,32-63","overlap,$1,$2,840,930")!=-1
fieldlen: 獲取LITERAL類型字段長度
舉例:
返回用戶名usr_name不為空的文檔
query=default:'關(guān)鍵詞'&&filter=fieldlen(usr_name)>0
in/notin: 判斷字段值是否(不)在指定列表中
舉例:
查詢文檔中包含"iphone"且type(int類型)為1或2或3的文檔:
query=default:'iphone'&&filter=in(type, "1|2|3")
查詢文檔中包含"iphone"且type(int32類型)不為1或2或3的文檔:
query=default:'iphone'&&filter=notin(type, "1|2|3")
multi_attr: 返回數(shù)組字段指定位置的值
舉例:
商品有多個價格[市場價、折扣價、銷售價],存到prices字段中。查詢銷售價小于1000的手機(jī):
query=default:'手機(jī)'&&filter=multi_attr(price,2)<1000
示例
應(yīng)用中有一個int32字段category,值分別為1(news),2(bbs)等,需要查詢分類category為2(bbs)且包含"浙大"的文檔:
query=default:'浙大' AND category_search:'2' //category字段創(chuàng)建了一個索引字段category_search //或者 query=default:'浙大'&&filter=category=2
小說應(yīng)用中有個LITERAL_ARRAY字段tags,表示小說風(fēng)格標(biāo)簽:"宮廷"、"懸疑恐怖"、"言情",需要查詢包含"甄嬛傳"且標(biāo)簽包含"宮廷"的文檔:
query=default:'甄嬛傳'&&filter=tags="宮廷"
電商應(yīng)用中有個int32的字段hit(點(diǎn)擊)和sale(銷量),及int64的字段create_time,需要查詢包含"連衣裙"且銷量與點(diǎn)擊的和乘上rate(偏移率)超過10000,創(chuàng)建時間早于1402345600的文檔:
query=default:'連衣裙'&&filter=(hit+sale)*rate>10000 AND create_time<1402345600