join

介绍

  • 功能:封装多阶段串联查询模式

  • 场景:KV表和KKV表的多度查询

  • 执行流程:

join1

语法

left_search
    join{
            joinfield clause
        [$alias clause]
        [&fields clause]
        [&filter clause]
        [&jointype clause]
        [&jointag clause]
        [&orderby clause]
        [&sorter clause]
        [&range clause]
    } 
right_search

left_search和right_search

  • left_search必须是一个atomic

  • right_search可以是atomic、join、merge、and以及andnot中的任意一种类型

  • left_searchright_search中不能存在同名的field。若存在,需要用alias解掉

必选子句

  • joinfield:joinfield=<leftfield[;rightfield]>

    • join kv/kkv 表时,leftfield字段必须在left_search返回的结果中存在,用于生成right_search中的keys参数列表。

    • join kv/kkv 表时,默认为right_search中表的主键字段,不用指定rightfield,指定也无效。

    • join 倒排表时

      • leftfield字段必须在left_search返回的结果中存在。

      • right_search中表的schema中必须要有rightfield的定义,并且该字段配置建立了索引。

可选子句

  • jointype:jointype=inner_join或者jointype=left_join

    • join子句支持inner join和left join两种类型

    • 默认是inner join

  • jointag:jointag=<tag_name>:<tag_id1>|<tag_id2>

    • jointag子句的功能是在left_join模式下,标示返回doc的右sub doc是否为空

    • tag_id的范围在1~15

    • 示例:定义jointag=join_tag:1|2, 如果右sub doc非空,返回结果doc的join_tag字段值为1;反之,为2

    • alias

    • distinct

    • fields

    • filter

    • orderby

    • range

    • sorter

结果集大小的控制

  • 三个range的默认行为

    • left_search在不指定range的情况下默认返回10条,同正常的atomic

    • right_search在不指定range的情况下默认返回无穷,目的是为了join时右子句有足够多的结果与左子句结果进行union操作

    • join本身在不指定range的情况下默认返回10条,同正常的atomic

  • 三个range的生效过程:左range-->右range-->join range

  • 三个range的根本含义

    • left_search的range根本目的是用来控制右子句的key数目

    • right_search的range控制右子句返回的结果集

    • join本身的range控制整个join最终返回的结果集

  • 结论

    • 理论上right_search的range应大于等于join本身的range数,才能达到预期效果

    • 指定right_search的range可以使查询速度更快

    • 最终结果集大致计算方法。其中,平均出度可以理解为右表每个pkey所挂的平均skey数目,kv表为1:

join_range(right_range(left_range(left_search)*平均出度(RightTable)))

示例

// 以userbkt表里pkey=8的catid值作为下一个查询的pkey值,由于两个subsearch结果里都有catid,于是将其中一个sub_search中的catid通过alias别名
// 以下两种做法都对
search{table=ig_ref_userbkt&keys=8&fields=catid&alias=catid:new}join{joinfield=new}search{table=ig_ref_userbkt}
<==>
search{table=ig_ref_userbkt&keys=8&fields=catid}join{joinfield=catid}search{table=ig_ref_userbkt&alias=catid:new}

// 指定输出price>35的值,并且将结果按照stare值逆序输出
search{table=ig_ref_userbkt&keys=8&fields=catid}join{joinfield=catid&filter=price>35&orderby=-stare}search{table=ig_ref_userbkt}