原英文版地址: https://www.elastic.co/guide/en/elasticsearch/reference/7.7/query-dsl-has-child-query.html, 原文档版权归 www.elastic.co 所有
本地英文版地址: ../en/query-dsl-has-child-query.html

has_child 查询

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

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

如果你在乎查询性能,请不要使用此查询。 如果你确实需要使用has_child查询,请尽量少用。

请求示例

创建索引

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

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

查询示例

GET /_search
{
    "query": {
        "has_child" : {
            "type" : "child",
            "query" : {
                "match_all" : {}
            },
            "max_children": 10,
            "min_children": 2,
            "score_mode" : "min"
        }
    }
}

has_child的顶级参数

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

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

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

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

max_children
(可选, integer) 允许的返回的父文档中与query相匹配的子文档的最大数量。 如果父文档中的与该查询匹配的子文档的数量超过此数量,它将从搜索结果中排除。
min_children
(可选, integer) 允许的返回的父文档中与query相匹配的子文档的最小数量。 如果父文档中的与该查询匹配的子文档的数量未达到此数量,它将从搜索结果中排除。
score_mode

(可选, string) 指示匹配子文档的分数如何影响根父文档的 相关性评分。有效值有:

none (默认)
不使用匹配子文档的相关性分数。该查询为父文档分配 0分。
avg
取所有匹配子文档的相关性分数的平均值。
max
取所有匹配子文档的相关性分数的最大值。
min
取所有匹配子文档的相关性分数的最小值。
sum
把所有匹配子文档的相关性分数相加。

注意

排序

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

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

GET /_search
{
    "query": {
        "has_child" : {
            "type" : "child",
            "query" : {
                "function_score" : {
                    "script_score": {
                        "script": "_score * doc['click_count'].value"
                    }
                }
            },
            "score_mode" : "max"
        }
    }
}