Nested Query

嵌套查询允许查询嵌套的对象。对嵌套对象/文档执行查询,就好像它们被索引在单独的文档(实际上是在内部),并返回根父文档。下面是我们将使用的映射:

  1. curl -X PUT "localhost:9200/my_index?pretty" -H 'Content-Type: application/json' -d'
  2. {
  3. "mappings": {
  4. "_doc" : {
  5. "properties" : {
  6. "obj1" : {
  7. "type" : "nested"
  8. }
  9. }
  10. }
  11. }
  12. }
  13. '
  1. PUT /my_index
  2. {
  3. "mappings": {
  4. "_doc" : {
  5. "properties" : {
  6. "obj1" : {
  7. "type" : "nested"
  8. }
  9. }
  10. }
  11. }
  12. }

下面是嵌套查询的用法:

  1. GET /_search
  2. {
  3. "query": {
  4. "nested" : {
  5. "path" : "obj1",
  6. "score_mode" : "avg",
  7. "query" : {
  8. "bool" : {
  9. "must" : [
  10. { "match" : {"obj1.name" : "blue"} },
  11. { "range" : {"obj1.count" : {"gt" : 5}} }
  12. ]
  13. }
  14. }
  15. }
  16. }
  17. }

path 指明了嵌套对象的路径,在查询内部的 query 将会在目标路径的下与根父文档链接嵌套文档上执行。注意,查询中引用的字段必须使用全路径。

score_mode 用来设置内部匹配的子文档影响父文档评分的方式。默认 avg,也可以是 sum, min, max and none。

这里也有 ignore_unmapped 选项,当设置为 true 时会忽略未映射的 path 且不会匹配任何文档。当查询不同映射的多索引时会很有用。当设置为 false(默认值),path 没有指定映射时会查询会抛出异常。

自动支持并检测多层级的嵌套,如果一个嵌套查询存在于另一个嵌套查询中,内部的嵌套查询会自动的匹配相关的层级(而不是 root)。