阿里云首页 智能推荐

倒排查询

语法

  • 倒排查询(sub_syntax)的语法类似 ES 查询语法。

  • sub_syntax 用 Json 描述,但是 Json 中 {} 与现有的 ABFS 语法冲突,因此所有 {} 需要转义为 \{ \}。

  • 倒排查询支持四种查询方式:单term、AND、OR、ANDNOT。

单term

  • "match" 用于按索引召回查询。

  • "name" 是需要查询的索引字段名称。

⚠️ 即便name是数字类型索引,那么查询关键词同样需要使用双引号引起来,否则查询失败。

⚠️ 要在表配置页面添加对应字段的索引配置,否则查询失败。

\{"match": \{ "name" : "刘德华"\} \}

AND

  • "and" 节点下的子节点个数需要 >= 2

  • "and" 子节点可以是 match,可以还是 and、or

\{  "and" : [       \{ "match" : \{ "name" : "刘德华"\} \},       \{ "match" : \{ "id"   : "102" \} \},       \{ "or"    : \{ ...... \} \}   ]\}

OR

  • "or" 节点下的子节点个数需要 >= 2

  • "or" 子节点可以是 match,可以还是 and、or

\{   "or" : [              \{ "match" : \{ "name" : "刘德华"\} \},       \{ "match" : \{ "id"   : "102" \} \},       \{ "and"   : \{ ...... \} \}    ]\}

ANDNOT

  • "andnot" 节点下的子节点个数必须 >= 2

  • T1 ADNNOT T2 ANDNOT ... ANDNOT Tn 其实等价于T1 ANDNOT (T2 OR T3 ... OR Tn)

\{  "andnot" : [      "match" : \{ "name" : "刘德华"\},      "match" : \{ ...... \}   ]\}

示例

Gremlin

  • 倒排检索需要使用indexQuery

  • 如果有indexQuery step修饰V step的话,V step的输入参数可以为空。

  • kv、kkv 表不能使用倒排查询

g.V().by("thinkerpop_modern_software_index").indexQuery("{\"match\":{\"lang\":\"java\"}}")==> {"label":"thinkerpop_modern_software_index","lang":"java","name":"ripple","pk":"5"}

PG

  • 倒排检索需要使用 indexsearch

  • atomic中,keys和indexsearch有且只有其中一个

  • join的right_search

  • 如果为indexsearch,必须通过joinfield指定右join字段名,joinfield不存在或者未创建独立索引时将join失败

  • 如果为KV或KKV表,无法通过joinfield指定右join字段名,指定也不会生效,join字段名只能为主键

// person 为倒排表,id 字段建立了索引search{table=friend&keys=101:102} join{joinfield=friend_id;id} search{table=person}// 下面两个查询等价search{table=person&indexsearch=\{"match": \{"name": "刘德华"\}\}}        join{joinfield=id;person_id} search{table=friend}<==>search{table=person&indexsearch=\{"match": \{"name": "刘德华"\}\}}        join{joinfield=id} search{table=friend}

注意事项

  • 倒排表实时数据更新最好不要超过5k qps, 不然会对查询性能有较大影响。

  • 倒排查询默认有查询截断(单列3k),查询结果很多的话不会完全seek出来, 这样查询的时候倒排链变化了,会影响候选集

  • 有一个字段是 f1 = "a,b,c,d",如果想查 f1 包含 a 或者 f1 包含 c ,如何用or和match组合实现?

  • 答:f1 字段配置索引字段时需要特别配置分词器(请看索引配置小节),索引创建时会分别以a b c d创建倒排索引。然后即可使用 match,or,and等进行组合查询。