子查询编辑

返回其连接的子文档匹配提供查询的父文档。您可以使用连接字段映射在同一索引中的文档之间创建父子关系。

由于它执行连接,因此has_child与其他查询相比速度较慢。随着指向唯一父文档的匹配子文档数量的增加,其性能会下降。搜索中的每个has_child查询都可能显着增加查询时间。

如果您关心查询性能,请不要使用此查询。如果您需要使用has_child查询,请尽可能少地使用它。

示例请求编辑

索引设置编辑

要使用has_child查询,您的索引必须包含连接字段映射。例如

response = client.indices.create(
  index: 'my-index-000001',
  body: {
    mappings: {
      properties: {
        "my-join-field": {
          type: 'join',
          relations: {
            parent: 'child'
          }
        }
      }
    }
  }
)
puts response
PUT /my-index-000001
{
  "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
(必需,字符串) 为连接字段映射的子关系的名称。
query
(必需,查询对象) 您希望在type字段的子文档上运行的查询。如果子文档匹配搜索,则查询将返回父文档。
ignore_unmapped

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

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

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

max_children
(可选,整数) 允许返回的父文档的匹配query的子文档的最大数量。如果父文档超过此限制,则将其从搜索结果中排除。
min_children
(可选,整数) 匹配返回的父文档的查询所需的匹配query的子文档的最小数量。如果父文档未达到此限制,则将其从搜索结果中排除。
score_mode

(可选,字符串) 指示匹配子文档的得分如何影响根父文档的相关性得分。有效值为

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