Has Parent 查询
has_parent 接受一个 query 和父类型。该查询执行于指定的父类型文档空间。该查询返回匹配父文档的关联子文档。其他方面,has_parent 与 has_child 有相同的配置,使用方式也一致。
GET /_search{"query": {"has_parent" : {"parent_type" : "blog","query" : {"term" : {"tag" : "something"}}}}}
因为执行了联接操作,相比于其他 dsl 查询来说就慢多了。随着匹配的父文档数量增多,查询性能逐渐下降。如果在乎查询性能,请不要使用它。但是如果碰巧使用了它,请尽可能少的使用。每一个添加到搜素请求中的该查询都会显著的增加查询时间。
评分能力
has_parent 也支持评分。默认值 false 忽略父文档评分。这种情形下,has_parent 中的 score 等价于默认值为 1 的 boost 。如果 score 设置为 true,匹配的父文档的评分将会聚合到相应的子文档。该评分模式可以通过 has_parent 下的 score 字段指定。
GET /_search{"query": {"has_parent" : {"parent_type" : "blog","score" : true,"query" : {"term" : {"tag" : "something"}}}}}
忽略未映射(ignore Unmapped)
当 ignore_unmapped 选项设置为 true 时,会忽略未映射的 type,且该查询不会匹配任何文档。当对不同映射的多个索引进行查询时比较有用。当设置为 false (默认值),type 没有映射时,查询会抛出异常。
排序
常规的排序选项无法通过匹配的父文档字段对子文档进行排序。如果需要父文档中字段排序子文档,可以使用function_score查询,然后通过_score排序。
例如,通过父文档中的 view_count 字段来排序 tags:
GET /_search{"query": {"has_parent" : {"parent_type" : "blog","score" : true,"query" : {"function_score" : {"script_score": {"script": "_score * doc['view_count'].value"}}}}}}
