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"
}
}
}
}
}
}