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