has_parent 查询

返回与其 联结的(joined) 且匹配查询的父文档的子文档。 可以使用 join 字段映射在同一索引中的文档之间创建父子关系。

因为它要执行联结,所以与其他查询相比,has_parent比较慢。 随着匹配父文档数量的增加,其性能会下降。 搜索中的每个has_parent查询都会显著地增加查询时间。

请求示例

创建索引

要使用 has_parent 查询,索引必须包含 join 字段映射。例如:

PUT /my-index
{
    "mappings": {
        "properties" : {
            "my-join-field" : {
                "type" : "join",
                "relations": {
                    "parent": "child"
                }
            },
            "tag" : {
                "type" : "keyword"
            }
        }
    }
}

查询示例

GET /my-index/_search
{
    "query": {
        "has_parent" : {
            "parent_type" : "parent",
            "query" : {
                "term" : {
                    "tag" : {
                        "value" : "Elasticsearch"
                    }
                }
            }
        }
    }
}

has_parent的顶级参数

parent_type
(必需, string) 为 join 字段映射的父关系的名称。
query
(必需, query object) 希望在 parent_type 字段的父文档上运行的查询。如果父文档与搜索匹配,查询将返回子文档。
score

(可选, boolean) 指示匹配父文档的 相关性评分 是否聚合到其子文档中。默认为false

如果为false,Elasticsearch 将忽略父文档的相关性评分。 Elasticsearch 还为每个子文档分配一个与 queryboost值相等的相关性评分,默认为 1

如果为 true,则匹配父文档的相关性评分被聚合到其子文档的相关性评分中。

ignore_unmapped

(可选, boolean) 指示是否忽略未映射的 parent_type 并且不返回任何文档而不是错误。默认为 false

如果为 false,当 parent_type 未映射时 Elasticsearch 会返回错误。

可以使用此参数来查询可能不包含 parent_type 的多个索引。

注意

排序

不能使用标准 排序选项has_parent 查询的结果进行排序。

如果需要按父文档中的字段对返回的文档进行排序,请使用 function_score 查询并按 _score排序。 例如,下面这个查询按父文档的 view_count 字段对返回的文档进行排序:

GET /_search
{
    "query": {
        "has_parent" : {
            "parent_type" : "parent",
            "score" : true,
            "query" : {
                "function_score" : {
                    "script_score": {
                        "script": "_score * doc['view_count'].value"
                    }
                }
            }
        }
    }
}