bit_struct
插件功能函數(shù)可以用在filter子句作為過濾和篩選條件,而返回值為數(shù)值型的功能函數(shù)在sort子句中,用來做排序。其中功能函數(shù)參數(shù)出現(xiàn)的文檔字段需根據(jù)對(duì)應(yīng)函數(shù)文檔提示,創(chuàng)建為索引或?qū)傩浴?/p>
功能函數(shù)項(xiàng)
1.介紹:
bit_struct: 將INT_ARRAY字段值進(jìn)行自定義分組并允許對(duì)分組值進(jìn)行指定operation計(jì)算。
2.語法:
bit_struct(doc_field,"$struct_definition", operation,...)
3.參數(shù):
doc_field: 是一個(gè)INT_ARRAY類型的字段名。
$struct_definition:用于把int64的值拆分成多個(gè)維度的信息。每一維的分組用int64中的起始bit位置和結(jié)束bit位置指定,使用橫線“-”分隔,bit位置從值的高端開始算起,從0開始,最大不能超過63。多個(gè)分組用逗號(hào)”,”分隔。每個(gè)分組有一個(gè)編號(hào),編號(hào)從1開始算起。舉例:假設(shè)用戶需要把int64拆分成3個(gè)維度的信息, bit0到bit9代表一個(gè)值(用$1表示), bit10到bit48代表一個(gè)值(用$2表示), bit49到bit60代表一個(gè)值(用$3表示), 則該參數(shù)可寫成:”0-9,10-48,49-60”。
operation:定義計(jì)算過程,最少定義1個(gè),最多定義5個(gè),每個(gè)operation會(huì)有一個(gè)編號(hào),這個(gè)編號(hào)是接著struct_definition中的編號(hào)開始遞增,當(dāng)需要定義多個(gè)operation時(shí),后面的operation要用到前面計(jì)算過的operation的返回值,這時(shí)候就可以用到給operation分配的編號(hào)了。operation 可以定義的操作有:
"equal,$m,$n": 判斷$m代表的值和$n代表的值是否相等,相等返回true,否則返回false。
"overlap,$m,$n,$k,$p":判斷($m,$n)和($k,$p)定義的范圍在數(shù)軸上是否相交。相交時(shí)返回true,否則返回false
"and,$m,$n,…":返回$m, $n,..等做and(&&)的結(jié)果。【注:上面的這3個(gè)操作的參數(shù)也可以是整數(shù)數(shù)字。 例如 “equal,$1,1”】
4.返回值:
int64,返回最后一個(gè)operation第一次為true時(shí)對(duì)應(yīng)的doc_field中的數(shù)組下標(biāo)(從0開始)。若doc_field中沒有滿足operation指定的要求的值,則返回-1。
5.注意事項(xiàng):
函數(shù)參數(shù)依賴字段需創(chuàng)建為屬性字段
場(chǎng)景舉例
查詢給定時(shí)間段在營業(yè)的店鋪有哪些? 假定用戶文檔中有一個(gè)int64_array類型的字段open_time,每個(gè)值表示一段營業(yè)時(shí)間,將int64的高32位表示起始時(shí)間,低32位表示結(jié)束時(shí)間,如果要查詢下午14點(diǎn)到15:30點(diǎn)營業(yè)的店鋪,可以將時(shí)間轉(zhuǎn)換為從當(dāng)天0點(diǎn)開始,按分鐘為單位的時(shí)間段, 則下午14點(diǎn)到15:30表示為(840,930),則查詢中filter子句可以寫為:
filter=bit_struct(open_time, "0-31,32-63","overlap,$1,$2,840,930")!=-1
查詢未來某一天,某個(gè)餐點(diǎn)(早,中,晚),可以提供Pmin到Pmax人數(shù)就餐的店鋪
假設(shè)用戶文檔中有一個(gè)int64_array類型的字段book_info,對(duì)于該字段中的一個(gè)值,0-7位表示日期,8-15位餐點(diǎn),16-41位表示最小人數(shù),42-63位表示最大人數(shù)。查詢明天(用1表示)晚上(用3表示)能服務(wù)3-5個(gè)人的店鋪,則filter子句可以寫為:
filter=bit_struct(book_info,"0-7,8-15,16-41,42-63",
"equal,$1,1","equal,$2,3","overlap,$3,$4,3,5","and,$5,$6,$7")!=-1
//解釋
這里$1表示book_info中0-7位代表的值,
$2表示book_info中8-15位代表的值
$3表示book_info中16-41位代表的值
$4表示book_info中42-63位代表的值
$5代表operation “equal,$1,1”的返回值
$6代表 operation”equal,$2,3”的返回值
$7代表operation “overlap,$3,$4,3,5”的返回值
返回$5,$6,$7代表的值做and(邏輯與)后第一次為true時(shí)候的值 在book_info中對(duì)應(yīng)的數(shù)組下標(biāo)
查詢下午14點(diǎn)到15:30表示為(840,930)之間,庫存>10的店鋪有哪些?因?yàn)閎it_struct返回的是下標(biāo),所以他可以和multi_attr函數(shù)一起配合使用,取另外一個(gè)array類型字段對(duì)應(yīng)下標(biāo)的值。如該例,可以在查詢語句中使用:
filter=multi_attr(store, bit_struct(dispatch_time,"0-31,32-63", "equal,$1,840", "equal,$2,930", "and,$3,$4"))>10
//解釋
dispatch_time是文檔中有一個(gè)多值INT64的字段,用于存儲(chǔ)商戶的配送時(shí)間。將時(shí)間轉(zhuǎn)換為從當(dāng)天0點(diǎn)開始,按分鐘為單位的時(shí)間段, 則下午14點(diǎn)到15:30表示為(840,930)
store是一個(gè)int64_array字段,與dispatch_time的時(shí)間段分別對(duì)應(yīng),表示該時(shí)間段的庫存量。
int64_array 數(shù)組值構(gòu)建介紹
樣例:
這里以Python為例,構(gòu)建一個(gè)早上8點(diǎn)~18點(diǎn)的int64
#開始時(shí)間8:00 以分鐘為單位
start=8*60
#結(jié)束時(shí)間18:00
end=18*60
#將int64的高32位表示起始時(shí)間,低32位表示結(jié)束時(shí)間
#先構(gòu)造高32
start=start<<32
print("高32",start)#2061584302080
#最終結(jié)果
result=start|end
print("結(jié)果",result)#2061584303160
結(jié)果:原理圖:二進(jìn)制:將480存到高32位上(原理:左移32位):將構(gòu)造的高32的結(jié)果,在將1080存到這個(gè)數(shù)的低32位上(原理 |):得到該數(shù)字的二級(jí)制為:0000000000000000000000011110000000000000000000000000010000111000其結(jié)果:與以上的Python dome的計(jì)算結(jié)果一致。
這里簡(jiǎn)單舉個(gè)例子:
假設(shè),需要判斷數(shù)組里是否有某個(gè)值,并且數(shù)值的值存在低32位中,filter寫法可以為:
bit_struct(type_arr,"0-31,32-63","equal,$2,40506")!=-1
//解釋:
"0-31,32-63":固定填入
"equal,$2,40506":判斷數(shù)組里有沒有值為40506