Elasticsearch 联结查询(joining queries)

Neil Zhu,简书ID Not_GOD,University AI 创始人 & Chief Scientist,致力于推进世界人工智能化进程。制定并实施 UAI 中长期增长战略和目标,带领团队快速成长为人工智能领域最专业的力量。
作为行业领导者,他和UAI一起在2014年创建了TASA(中国最早的人工智能社团), DL Center(深度学习知识中心全球价值网络),AI growth(行业智库培训)等,为中国的人工智能人才建设输送了大量的血液和养分。此外,他还参与或者举办过各类国际性的人工智能峰会和活动,产生了巨大的影响力,书写了60万字的人工智能精品技术内容,生产翻译了全球第一本深度学习入门书《神经网络与深度学习》,生产的内容被大量的专业垂直公众号和媒体转载与连载。曾经受邀为国内顶尖大学制定人工智能学习规划和教授人工智能前沿课程,均受学生和老师好评。

在像 Elasticsearch 这样的分布式计算系统执行全 SQL 风格的联结操作代价昂贵。相应地,Elasticsearch 提供了两种形式的联结可以实现水平规模的扩展。

  • 嵌套查询 nested query:文档包含 nested 类型的字段。这些字段用来索引数组对象,其中每个对象作为独立的文档可以被检索(使用 nested 查询)。
  • has_childhas_parent 查询:父子关系可以在一个单独的索引中的两个文档类型间存在。has_child 查询返回了父文档,其子文档匹配了特定的查询。而 has_parent 查询返回子文档,其父文档匹配了特定的查询。

参考 terms-lookup mechanism,也可以让你从另一个文档中值中构建一个 terms 查询。

Nested Query

嵌套查询可以查询嵌套的对象/文档(参考 nested mapping)。查询是针对当做是内部按照分隔的文档索引的嵌套对象/文档进行的,返回根 parent 文档(或者 parent 嵌套映射)。这里是一个映射的例子:

{
    "type1" : {
        "properties" : {
            "obj1" : {
                "type" : "nested"
            }
        }
    }
}

这里是一个嵌套查询的例子:

{
    "nested" : {
        "path" : "obj1",
        "score_mode" : "avg",
        "query" : {
            "bool" : {
                "must" : [
                    {
                        "match" : {"obj1.name" : "blue"}
                    },
                    {
                        "range" : {"obj1.count" : {"gt" : 5}}
                    }
                ]
            }
        }
    }
}

这个查询的 path 指向了嵌套的对象路径,而 query 或者 filter 包含了会在匹配了直接的路径并且和根 parent 文档连接的嵌套的文档上运行。注意,任何在这个查询内部引用的字段必须使用完整的路径。

score_mode 使得我们可以设置内部 children 匹配影响 parent 文档。默认是 avg,但是也可以设置为 summinmaxnone

多层嵌套自动支持,检查,并产生一个内部的嵌套查询来自动匹配相关的嵌套层级(不是根 root)如果存在在另一个嵌套查询中。

Has Child Query

has_child 过滤器接受一个查询和 child 类型来执行,产生 parent 文档拥有匹配查询的 child 文档。这里是例子:

{
    "has_child" : {
        "type" : "blog_tag",
        "query" : {
            "term" : {
                "tag" : "something"
            }
        }
    }
}

打分能力

has_child 查询同样有打分的支持。支持的模式有 minmaxtotalavg 或者 none。默认的模式是 none 会产生同样的行为。如果打分模式设成了另外一种,那么所有匹配的 child 文档的分数都会被聚合在关联的 parent 文档上。打分类型可以使用 score_mode 字段在 has_child 查询内部指定:

{
    "has_child" : {
        "type" : "blog_tag",
        "score_mode" : "sum",
        "query" : {
            "term" : {
                "tag" : "something"
            }
        }
    }
}

Min/Max Children

has_child 查询允许我们指定最小/最大数目的 children 需要匹配来让 parent doc 被当做是一个匹配:

{
    "has_child" : {
        "type" : "blog_tag",
        "score_mode" : "sum",
        "min_children": 2, 
        "max_children": 10, 
        "query" : {
            "term" : {
                "tag" : "something"
            }
        }
    }
}

min_childrenmax_children 都是可选的。

min_childrenmax_children 参数可以和 score_mode 参数组合使用。

Has Parent Query

has_parent 查询接受查询和 parent 类型。查询是在 parent 文档空间上进行的,这个是通过 parent 类型指定的。该查询返回和关联的 parent 文档匹配的 child 文档。剩下的设置都和 has_child 查询相同。

{
    "has_parent" : {
        "parent_type" : "blog",
        "query" : {
            "term" : {
                "tag" : "something"
            }
        }
    }
}

打分能力

has_parent 同样也有打分支持。支持的打分类型就是 score 或者 none。默认是 none,忽略了来自 parent 文档的分数。这里的分数和 has_parent 查询相同。如果打分类型设置为 score,那么匹配的 parent 文档的分数就被聚合在 child 文档中属于匹配的 parent 文档。打分模式可以使用 score_modehas_parent query 中指定:

{
    "has_parent" : {
        "parent_type" : "blog",
        "score_mode" : "score",
        "query" : {
            "term" : {
                "tag" : "something"
            }
        }
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容