本书基于 Elasticsearch 2.x 版本,有些内容可能已经过时。 Elasticsearch: 权威指南 » 数据建模 » 父-子关系文档 » 通过子文档查询父文档 « 构建父-子文档索引 通过父文档查询子文档 »
通过子文档查询父文档编辑
has_child
的查询和过滤可以通过子文档的内容来查询父文档。
例如,我们根据如下查询,可查出所有80后员工所在的分公司:
GET /company/branch/_search { "query": { "has_child": { "type": "employee", "query": { "range": { "dob": { "gte": "1980-01-01" } } } } } }
类似于 nested
query ,has_child
查询可以匹配多个子文档
,并且每一个子文档的评分都不同。但是由于每一个子文档都带有评分,这些评分如何规约成父文档的总得分取决于 score_mode
这个参数。该参数有多种取值策略:默认为 none
,会忽略子文档的评分,并且会给父文档评分设置为 1.0
;
除此以外还可以设置成 avg
、 min
、 max
和 sum
。
下面的查询将会同时返回 london
和 liverpool
,不过由于 Alice Smith
要比 Barry Smith
更加匹配查询条件,因此 london
会得到一个更高的评分。
GET /company/branch/_search { "query": { "has_child": { "type": "employee", "score_mode": "max", "query": { "match": { "name": "Alice Smith" } } } } }
score_mode
为默认的 none
时,会显著地比其模式要快,这是因为Elasticsearch不需要计算每一个子文档的评分。只有当你真正需要关心评分结果时,才需要为 score_mode
设值,例如设成 avg
、 min
、 max
或 sum
。
min_children 和 max_children编辑
has_child
的查询和过滤都可以接受这两个参数:min_children
和 max_children
。
使用这两个参数时,只有当子文档数量在指定范围内时,才会返回父文档。
如下查询只会返回至少有两个雇员的分公司:
GET /company/branch/_search { "query": { "has_child": { "type": "employee", "min_children": 2, "query": { "match_all": {} } } } }
| 至少有两个雇员的分公司才会符合查询条件。 |
带有 min_children
和 max_children
参数的 has_child
查询或过滤,和允许评分的 has_child
查询的性能非常接近。
has_child Filter
has_child
查询和过滤在运行机制上类似,
区别是 has_child
过滤不支持 score_mode
参数。has_child
过滤仅用于筛选内容--如内部的一个 filtered
查询--和其他过滤行为类似:包含或者排除,但没有进行评分。
has_child
过滤的结果没有被缓存,但是 has_child
过滤内部的过滤方法适用于通常的缓存规则。
Getting Started Videos
- Starting Elasticsearch
- Introduction to Kibana
- Logstash Starter Guide
官方地址:https://www.elastic.co/guide/cn/elasticsearch/guide/current/has-child.html