通用子句

部分子句的执行顺序

  • 召回过程:alias->filter->localcount

  • 总流程:召回->orderby->distinct->fields

alias

  • 功能:指定虚拟字段。

    • 如果是原始字段被直接定义为虚拟字段,那么其他模块(filter, sorter,orderby,distinct等)只能通过虚拟字段即别名来访问该字段。

    • 支持将表达式定义为虚拟字段。

    • 支持用已经定义的虚拟字段来定义新的虚拟字段,但禁止存在递归定义。

  • 格式:alias=field_name1:new_name1;<expression>:new_name2;...

    • 例如:alias=username:nickalias=to_double(price)+sqrt(auction)*20+cos(300):field_alias;field_alias+100:field_alias_2

distinct

  • 功能:限制返回结果中同值字段的数目

    • 适用于mergejoinatomic语句

  • 格式:distinct=<expr1>[;<expr2>;<expr3>][|<count>][|$]

    • distinct不支持多值类型

    • distinct不支持逻辑表达式(如distinct=field1>0|2),但是支持算式(如distinct=field1+10|2

    • 不加|count语句,默认返回数量为1

    • 例如我们需要限制字段名为"field1"相同值个数最多为2,可以表达为:distinct=field1|2

    • 增加’|$'标记,表示distinct时不对数据进行删除,而是append到结果最后(不保证顺序)

      • 如数据集S={1,1,1,2,2,2,3,3,4,5,5,5},对S进行distinct=S|2,其结果为d(S)={1,1,2,2,3,3,4,5,5}

      • 如数据集S={1,1,1,2,2,2,3,3,4,5,5,5},对S进行distinct=S|2|$,其结果为d(S)={1,1,2,2,3,3,4,5,5,1,2,5}

      • 在指定截断时必须指明count数,否则语法错误

fields

  • 功能:指定需要返回的原始字段或者虚拟字段

    • 如果没有指定,默认返回所有的原始字段和虚拟字段。

  • 格式:fields=field_name1;field_name2;...

filter

  • 功能:指定过滤条件

  • 格式:filter=<expression1>

    • 例如filter=f1>100filter=f1*f2<50filter=f1=f2filter=f1!=f2 AND f1>10filter=sqrt(f1)>2

  • 注意事项

    • 字符串在filter中使用需要加双引号,如filter=type="吊牌"

    • 字符串只支持判等,不支持<>

    • filter在对两个字段进行比较的时候要求字段类型一致。

    • 多值字段的比较,在=的情况下为or逻辑,其他情况下(><)为and逻辑

      • 即一个多值字段中全部值不等于条件才判真,有一个等于条件满足即判真

      • 不支持多值字段与多值字段比较

    • 表达式的操作符存在优先级,从高到低依次为:> -- = -- @ -- AND

    • 表达式的操作符支持结合律,同c语言的保持一致。推荐加上小括号()来保证操作符的执行顺序。例如,filter=(relation_type=1) AND (property@1024)>0

localcount

  • 功能:指定单个pkey需要返回的结果数量。

    • 如果没有指定,那么只保证结果的总数量符合range子句规定,而不关心单个pkey的召回数量。

    • 如果指定,每个pkey最多召回count个结果。

  • 格式:localcount=<count>

    • count是非负整数,例如localcount=2

orderby

  • 功能:指定采用内置默认排序模块,以及排序维度。

    • orderby不支持多值类型

    • 默认为倒序

  • 格式:orderby=<expression1>;field_name;<expression2>;...

    • +为正序(由小到大),-为倒序

    • 例如orderby=+f1;-f2/100

range

  • 功能:指定具体返回的结果范围

    • 不指定range子句,默认返回10条

    • range在满足其他子句逻辑后在执行

    • range是在对应结果集范围内控制,非某个key范围

  • 格式:range=<start_offset>:<count>

    • start_offset为非负整数,意思是起始的查询行数,例如range=0:10

sorter

  • 功能:指定采用用户定制的排序模块进行排序。

    • sorter 和 orderby 参数如果同时使用,只有 sorter 生效**。

    • ABFS 提供内置随机打散插件 __igraph_random_buildin_sorter__(前后均是两个下划线)。

__igraph_random_buildin_sorter__

  • 功能:对原始文档进行随机打散。

  • 格式:sorter=__igraph_random_buildin_sorter__<:seed=xxx>

    • 参数seed指定随机种子,用于调试。

    • 不指定参数seed,默认基于当前时间做随机种子。

    • 示例

// 随机打散召回的文档
search{table=userinfo&keys=2;10;5;14&sorter=__abfs_random_buildin_sorter__

// 结合distinct子句,随机打散文档( pp 为 primary key 字段)。
search{table=userinfo&keys=2;10;5;14&sorter=__igraph_random_buildin_sorter__&distinct=pp|2

// 指定随机种子。
search{table=userinfo&keys=2;10;5;14&sorter=__igraph_random_buildin_sorter__:seed=1111&distinct=pp|2

tag

  • 功能:指定左右查询结果来源。

    • 适用于merge语句

    • 使用 tag 子句后,系统会在结果集中附加一个用于区分结果来源的默认字段abfs_buildin_tag_field。该字段具体取值需要用户指定。不同取值标记了该 MatchRecord 的来源。

    • 使用嵌套 merge 语句时,可以多重使用 tag 子句。

  • 格式:tag=<left_tagid>:<right_tagid>

    • tagid范围:1-15 的整数。

    • tag=1:2为例,左结果集中的abfs_buildin_tag_field将会被写入1,右结果集中为2。

// tag=3:4 中的 3 不会覆盖子 merge 语句中的 tag=1:2
// 最终返回的结果中`abfs_buildin_tag_field`字段取值为 1、2、4 
search{table=ig_ref_userbkt&keys=2:33}
        merge{tag=1:2}search{table=userinfo&keys=2:1}
    merge{orderby=-price|tag=3:4}search{table=userinfo&keys=1}

阿里云首页 智能推荐 AIRec 相关技术圈