Has Parent 查询

has_parent 接受一个 query 和父类型。该查询执行于指定的父类型文档空间。该查询返回匹配父文档的关联子文档。其他方面,has_parenthas_child 有相同的配置,使用方式也一致。

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

因为执行了联接操作,相比于其他 dsl 查询来说就慢多了。随着匹配的父文档数量增多,查询性能逐渐下降。如果在乎查询性能,请不要使用它。但是如果碰巧使用了它,请尽可能少的使用。每一个添加到搜素请求中的该查询都会显著的增加查询时间。

评分能力

has_parent 也支持评分。默认值 false 忽略父文档评分。这种情形下,has_parent 中的 score 等价于默认值为 1 的 boost 。如果 score 设置为 true,匹配的父文档的评分将会聚合到相应的子文档。该评分模式可以通过 has_parent 下的 score 字段指定。

  1. GET /_search
  2. {
  3. "query": {
  4. "has_parent" : {
  5. "parent_type" : "blog",
  6. "score" : true,
  7. "query" : {
  8. "term" : {
  9. "tag" : "something"
  10. }
  11. }
  12. }
  13. }
  14. }

忽略未映射(ignore Unmapped)

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

排序

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

例如,通过父文档中的 view_count 字段来排序 tags:

  1. GET /_search
  2. {
  3. "query": {
  4. "has_parent" : {
  5. "parent_type" : "blog",
  6. "score" : true,
  7. "query" : {
  8. "function_score" : {
  9. "script_score": {
  10. "script": "_score * doc['view_count'].value"
  11. }
  12. }
  13. }
  14. }
  15. }
  16. }