Joining查询
在像Elasticsearch这样的分布式系统中执行完全sql风格的join代价非常高,相反,Elasticsearch提供了两种旨在横向伸缩的join形式。
nested
查询
文档可能包含嵌套类型的字段,这些字段用于索引对象数组,其中每个对象都可以作为独立文档查询(使用nested
查询)。
has_child
和has_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
,但可以是sum
、min
、max
和none
。
还有一个ignore_unmapped
选项,当设置为true
时,它会忽略一个未映射的path
,并且不会匹配这个查询的任何文档,这在查询可能具有不同映射的多个索引时非常有用。当设置为false
(默认值)时,如果path
没有映射,查询将抛出异常。
自动支持和检测多级嵌套,结果是生成一个内部嵌套查询,如果它存在于另一个嵌套查询中,则自动匹配相关的嵌套级别(而不是根)。
子查询
has_child
过滤器接受要运行的查询和子类型,并生成子文档与查询匹配的父文档,这里有一个例子:
GET /_search
{
"query": {
"has_child" : {
"type" : "blog_tag",
"query" : {
"term" : {
"tag" : "something"
}
}
}
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。