全部产品
云市场

bit_struct

更新时间:2017-06-07 13:26:11

功能函数项

插件功能函数可以用在filter子句作为过滤和筛选条件,而返回值为数值型的功能函数在sort子句中,用来做排序。其中功能函数参数出现的文档字段需根据对应函数文档提示,创建为索引或属性.

bit_struct: 将INT_ARRAY字段值进行自定义分组并允许对分组值进行指定operation计算

  1. 详细用法
    bit_struct(doc_field, “$struct_definition”, operation, …)

  2. 参数
    doc_field: 是一个INT_ARRAY类型的字段名。

    “$struct_definition”:用于把int64的值拆分成多个维度的信息。每一维的分组用int64中的起始bit位置和结束bit位置指定,使用横线“-”分隔,bit位置从值的高端开始算起,从0开始,最大不能超过63。多个分组用逗号”,”分隔。每个分组有一个编号,编号从1开始算起。
    举例:假设用户需要把int64拆分成3个维度的信息, bit0到bit9代表一个值(用$1表示), bit10到bit48代表一个值(用$2表示), bit49到bit60代表一个值(用$3表示), 则该参数可写成: ”0-9,10-48,49-60”。

    operation:定义计算过程,最少定义1个,最多定义5个,每个operation会有一个编号,这个编号是接着struct_definition中的编号开始递增,当需要定义多个operation时,后面的operation要用到前面计算过的operatoin的返回值,这时候就可以用到给operation分配的编号了。
    operation 可以定义的操作有:
    “equal,$m,$n”: 判断$m代表的值和$n代表的值是否相等,相等返回true,否则返回false。
    “overlap,$m,$n,$k,$p”:判断($m,$n)和($k,$p)定义的范围在数轴上是否相交。相交时返回true,否则返回false
    “and,$m,$n,…”:返回$m, $n,..等做and(&&)的结果。
    注:上面的这3个操作的参数也可以是整数数字。 例如 “equal,$1,1”

  3. 返回值
    int64,返回最后一个operation第一次为true时对应的doc_field中的数组下标(从0开始)。若doc_field中没有满足operation指定的要求的值,则返回-1。

  4. 场景举例

    • 查询给定时间段在营业的店铺有哪些
      假定用户文档中有一个int64_array类型的字段open_time,每个值表示一段营业时间,将int64的高32位表示起始时间,低32位表示结束时间,如果要查询下午14点到15:30点营业的店铺,可以将时间转换为从当天0点开始,按分钟为单位的时间段, 则下午14点到15:30表示为(840,930),则查询中filter子句可以写为:
      filter=bit_struct(open_time, “0-31,32-63”,”overlap,$1,$2,840,930”)!=-1

    • 查询未来某一天,某个餐点(早,中,晚),可以提供Pmin到Pmax人数就餐的店铺
      假设用户文档中有一个int64_array类型的字段book_info,对于该字段中的一个值,0-7位表示日期,8-15位餐点,16-41位表示最小人数,42-63位表示最大人数。查询明天(用1表示)晚上(用3表示)能服务3-5个人的店铺,则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时候的值 在book_info中对应的数组下标

    • 查询下午14点到15:30表示为(840,930)之间,库存>10的店铺有哪些?
      因为bit_struct返回的是下标,所以他可以和multi_attr函数一起配合使用,取另外一个array类型字段对应下标的值。如该例,可以在查询语句中使用:
      filter=multi_attr(store, bit_struct(dispatch_time,”0-31,32-63”, “equal,$1,840”, “equal,$2,930”, “and,$3,$4”))>10
      dispatch_time是文档中有一个多值INT64的字段,用于存储商户的配送时间。将时间转换为从当天0点开始,按分钟为单位的时间段, 则下午14点到15:30表示为(840,930)
      store是一个int64_array字段,与dispatch_time的时间段分别对应,表示该时间段的库存量。

  5. 注意事项

  • 函数参数依赖字段需创建为属性
  • 更多介绍请参考 这里