Joining查询

在像Elasticsearch这样的分布式系统中执行完全sql风格的join代价非常高,相反,Elasticsearch提供了两种旨在横向伸缩的join形式。

nested查询

文档可能包含嵌套类型的字段,这些字段用于索引对象数组,其中每个对象都可以作为独立文档查询(使用nested查询)。

has_childhas_parent查询

在单个索引中的文档之间可以存在联接字段关系,has_child查询返回子文档与指定查询匹配的父文档,而has_parent查询返回父文档与指定查询匹配的子文档。

还可以在terms查询中查看terms查找机制,它允许你从另一个文档中包含的值构建术语查询。

嵌套查询

嵌套查询允许查询嵌套对象/文档(参见嵌套映射),对嵌套的对象/文档执行查询,就好像它们被索引为独立的文档(在内部)一样,并且结果是根父文档(或父嵌套映射),下面是我们将使用的示例映射:

PUT /my_index
{
    "mappings": {
        "type1" : {
            "properties" : {
                "obj1" : {
                    "type" : "nested"
                }
            }
        }
    }
}

下面是一个嵌套查询用法示例:

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

查询path指向嵌套的对象路径,query包括将在嵌套文档上运行的与直接路径匹配的查询,并与根父文档连接,注意,查询中引用的任何字段都必须使用完整路径(完全限定)。

score_mode允许设置内部子匹配如何影响父得分,它默认为avg,但可以是summinmaxnone

还有一个ignore_unmapped选项,当设置为true时,它会忽略一个未映射的path,并且不会匹配这个查询的任何文档,这在查询可能具有不同映射的多个索引时非常有用。当设置为false(默认值)时,如果path没有映射,查询将抛出异常。

自动支持和检测多级嵌套,结果是生成一个内部嵌套查询,如果它存在于另一个嵌套查询中,则自动匹配相关的嵌套级别(而不是根)。

子查询

has_child过滤器接受要运行的查询和子类型,并生成子文档与查询匹配的父文档,这里有一个例子:

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

博弈
2.5k 声望1.5k 粉丝

态度决定一切