Has Child 查询
has_child 过滤器接收一个查询和针对操作的子类型,并返回子级满足查询的父文档。如:
GET /_search{"query": {"has_child" : {"type" : "blog_tag","query" : {"term" : {"tag" : "something"}}}}}
相比于 dsl 的其他查询,has_child 查询执行了联接操作,所以执行较慢。随着指向唯一父文档的子文档数量增多,查询性能也逐渐降低。如果担心查询性能,就不应该使用该查询。但是如果碰巧使用该查询,请尽可能少地使用它。每一个添加到搜索请求中的 has_child 查询都会显著的增加查询时间。
评分能力
该查询支持评分,支持的分数模式包括 min,max,avg,sum or none。默认值 none 与之前的版本有一样的行为。如果将分数模式设置为其他值,所有匹配的子文档分数将会汇总到关联的父文档上。分数类型可以由 has_child 查询中的 score_mode 来指定:
GET /_search{"query": {"has_child" : {"type" : "blog_tag","score_mode" : "min","query" : {"term" : {"tag" : "something"}}}}}
Min/Max Children
该查询允许指定子文档满足的最大/最小数量,返回匹配的父文档:
GET /_search{"query": {"has_child" : {"type" : "blog_tag","score_mode" : "min","min_children": 2,"max_children": 10,"query" : {"term" : {"tag" : "something"}}}}}
min_children 与 max_children 参数可以结合 score_mode参数使用。
忽略未映射
当 ignore_unmapped 选项设置为 true 时,会忽略未映射的 type,且该查询不会匹配任何文档。当对不同映射的多个索引进行查询时比较有用。当设置为 false (默认值),type 没有映射时,查询会抛出异常。
排序
常规的排序选项无法通过匹配的子文档字段对父文档进行排序。如果需要使用子文档的字段对父文档排序,可以使用 function_score 查询,并通过 _score 排序。
通过子文档的 click_count 对博客排序:
GET /_search{"query": {"has_child" : {"type" : "blog_tag","score_mode" : "max","query" : {"function_score" : {"script_score": {"script": "_score * doc['click_count'].value"}}}}}}
