全文检索(elasticsearch联结查询(joining queries)

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

  • 嵌套查询 nested query:文档包含 nested 类型的字段。这些字段用来索引数组对象,其中每个对象作为独立的文档可以被检索(使用 nested 查询)。
  • has_child 和 has_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,但是也可以设置为 sum、min、max 和 none。

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

Has Child Query

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

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

打分能力

has_child 查询同样有打分的支持。支持的模式有 min、max、total、avg 或者 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_children 和 max_children 都是可选的。

min_children 和 max_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_mode 在 has_parent query 中指定:

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