父查询
编辑父查询
编辑返回其已连接的父文档匹配提供的查询的子文档。您可以使用连接字段映射在同一索引中的文档之间创建父子关系。
因为它执行连接,所以has_parent
查询与其他查询相比速度较慢。其性能会随着匹配的父文档数量的增加而下降。搜索中的每个has_parent
查询都可能显着增加查询时间。
示例请求
编辑索引设置
编辑要使用has_parent
查询,您的索引必须包含连接字段映射。例如
resp = client.indices.create( index="my-index-000001", mappings={ "properties": { "my-join-field": { "type": "join", "relations": { "parent": "child" } }, "tag": { "type": "keyword" } } }, ) print(resp)
response = client.indices.create( index: 'my-index-000001', body: { mappings: { properties: { "my-join-field": { type: 'join', relations: { parent: 'child' } }, tag: { type: 'keyword' } } } } ) puts response
const response = await client.indices.create({ index: "my-index-000001", mappings: { properties: { "my-join-field": { type: "join", relations: { parent: "child", }, }, tag: { type: "keyword", }, }, }, }); console.log(response);
PUT /my-index-000001 { "mappings": { "properties": { "my-join-field": { "type": "join", "relations": { "parent": "child" } }, "tag": { "type": "keyword" } } } }
示例查询
编辑resp = client.search( index="my-index-000001", query={ "has_parent": { "parent_type": "parent", "query": { "term": { "tag": { "value": "Elasticsearch" } } } } }, ) print(resp)
const response = await client.search({ index: "my-index-000001", query: { has_parent: { parent_type: "parent", query: { term: { tag: { value: "Elasticsearch", }, }, }, }, }, }); console.log(response);
GET /my-index-000001/_search { "query": { "has_parent": { "parent_type": "parent", "query": { "term": { "tag": { "value": "Elasticsearch" } } } } } }
has_parent
的顶级参数
编辑-
parent_type
- (必需,字符串)连接字段映射的父关系名称。
-
query
- (必需,查询对象)您希望对
parent_type
字段的父文档运行的查询。如果父文档匹配搜索,则查询将返回其子文档。 -
score
-
(可选,布尔值)指示是否将匹配父文档的相关性评分聚合到其子文档中。默认为
false
。如果为
false
,则 Elasticsearch 将忽略父文档的相关性评分。Elasticsearch 还为每个子文档分配一个等于query
的boost
(默认为1
)的相关性评分。如果为
true
,则匹配父文档的相关性评分将聚合到其子文档的相关性评分中。 -
ignore_unmapped
-
(可选,布尔值)指示是否忽略未映射的
parent_type
并返回任何文档而不是错误。默认为false
。如果为
false
,则如果parent_type
未映射,Elasticsearch 将返回错误。您可以使用此参数查询可能不包含
parent_type
的多个索引。
备注
编辑排序
编辑您不能使用标准的排序选项对has_parent
查询的结果进行排序。
如果您需要按其父文档中的字段对返回的文档进行排序,请使用function_score
查询并按_score
排序。例如,以下查询按其父文档的view_count
字段对返回的文档进行排序。
resp = client.search( query={ "has_parent": { "parent_type": "parent", "score": True, "query": { "function_score": { "script_score": { "script": "_score * doc['view_count'].value" } } } } }, ) print(resp)
const response = await client.search({ query: { has_parent: { parent_type: "parent", score: true, query: { function_score: { script_score: { script: "_score * doc['view_count'].value", }, }, }, }, }, }); console.log(response);
GET /_search { "query": { "has_parent": { "parent_type": "parent", "score": true, "query": { "function_score": { "script_score": { "script": "_score * doc['view_count'].value" } } } } } }