Has Child 查询

has_child 过滤器接收一个查询和针对操作的子类型,并返回子级满足查询的父文档。如:

  1. GET /_search
  2. {
  3. "query": {
  4. "has_child" : {
  5. "type" : "blog_tag",
  6. "query" : {
  7. "term" : {
  8. "tag" : "something"
  9. }
  10. }
  11. }
  12. }
  13. }

相比于 dsl 的其他查询,has_child 查询执行了联接操作,所以执行较慢。随着指向唯一父文档的子文档数量增多,查询性能也逐渐降低。如果担心查询性能,就不应该使用该查询。但是如果碰巧使用该查询,请尽可能少地使用它。每一个添加到搜索请求中的 has_child 查询都会显著的增加查询时间。

评分能力

该查询支持评分,支持的分数模式包括 min,max,avg,sum or none。默认值 none 与之前的版本有一样的行为。如果将分数模式设置为其他值,所有匹配的子文档分数将会汇总到关联的父文档上。分数类型可以由 has_child 查询中的 score_mode 来指定:

  1. GET /_search
  2. {
  3. "query": {
  4. "has_child" : {
  5. "type" : "blog_tag",
  6. "score_mode" : "min",
  7. "query" : {
  8. "term" : {
  9. "tag" : "something"
  10. }
  11. }
  12. }
  13. }
  14. }

Min/Max Children

该查询允许指定子文档满足的最大/最小数量,返回匹配的父文档:

  1. GET /_search
  2. {
  3. "query": {
  4. "has_child" : {
  5. "type" : "blog_tag",
  6. "score_mode" : "min",
  7. "min_children": 2,
  8. "max_children": 10,
  9. "query" : {
  10. "term" : {
  11. "tag" : "something"
  12. }
  13. }
  14. }
  15. }
  16. }

min_childrenmax_children 参数可以结合 score_mode参数使用。

忽略未映射

ignore_unmapped 选项设置为 true 时,会忽略未映射的 type,且该查询不会匹配任何文档。当对不同映射的多个索引进行查询时比较有用。当设置为 false (默认值),type 没有映射时,查询会抛出异常。

排序

常规的排序选项无法通过匹配的子文档字段对父文档进行排序。如果需要使用子文档的字段对父文档排序,可以使用 function_score 查询,并通过 _score 排序。

通过子文档的 click_count 对博客排序:

  1. GET /_search
  2. {
  3. "query": {
  4. "has_child" : {
  5. "type" : "blog_tag",
  6. "score_mode" : "max",
  7. "query" : {
  8. "function_score" : {
  9. "script_score": {
  10. "script": "_score * doc['click_count'].value"
  11. }
  12. }
  13. }
  14. }
  15. }
  16. }