当我使用查询的“字段”选项时,我为每个字段获得一个单独的数组。是否有可能取回“完整的”嵌套对象,而不仅仅是字段?

在下面的示例中,如果我尝试执行"fields": ["cast"],它将告诉我cast不是叶节点。如果我执行"fields": ["cast.firstName", "cast.middleName", "cast.lastName"],它将返回3个数组。

是否有另一种方法可以只检索部分文档?还是有一种方法可以将各个字段“重组”为一个完整的“cast”对象?

示例索引和数据:

POST /movies
{
   "mappings": {
      "movie": {
         "properties": {
            "cast": {
               "type": "nested"
            }
         }
      }
   }
}

POST /movies/movie
{
   "title": "The Matrix",
   "cast": [
      {
         "firstName": "Keanu",
         "lastName": "Reeves",
         "address": {
            "street": "somewhere",
            "city": "LA"
         }
      },
      {
         "firstName": "Laurence",
         "middleName": "John",
         "lastName": "Fishburne",
         "address": {
            "street": "somewhere else",
            "city": "NYC"
         }
      }
   ]
}

查询示例:
GET /movies/_search
{
   "query": {
      "filtered": {
         "query": {
            "match_all": {}
         },
         "filter": {
            "nested": {
               "path": "cast",
               "filter": {
                  "bool": {
                     "must": [
                        { "term": { "firstName": "laurence"} },
                        { "term": { "lastName": "fishburne"} }
                     ]
                  }
               }
            }
         }
      }
   },
   "fields": [
      "cast.address.city",
      "cast.firstName",
      "cast.middleName",
      "cast.lastName"
   ]
}

示例查询的结果:
{
   "took": 1,
   "timed_out": false,
   "_shards": {
      "total": 5,
      "successful": 5,
      "failed": 0
   },
   "hits": {
      "total": 1,
      "max_score": 1,
      "hits": [
         {
            "_index": "movies",
            "_type": "movie",
            "_id": "AU1JeyBseLgwMCOuOLsZ",
            "_score": 1,
            "fields": {
               "cast.firstName": [
                  "Keanu",
                  "Laurence"
               ],
               "cast.lastName": [
                  "Reeves",
                  "Fishburne"
               ],
               "cast.address.city": [
                  "LA",
                  "NYC"
               ],
               "cast.middleName": [
                  "John"
               ]
            }
         }
      ]
   }
}

最佳答案

我认为这是您要寻找的:

POST /movies/_search
{
  "_source": {
    "include": [
      "cast.address.city",
      "cast.firstName",
      "cast.middleName",
      "cast.lastName"
    ]
  },
  "query": {
    "filtered": {
      "query": {
        "match_all": {}
      },
      "filter": {
        "nested": {
          "path": "cast",
          "filter": {
            "bool": {
              "must": [
                {
                  "term": {
                    "firstName": "laurence"
                  }
                },
                {
                  "term": {
                    "lastName": "fishburne"
                  }
                }
              ]
            }
          }
        }
      }
    }
  }
}

结果:
{
   "took": 2,
   "timed_out": false,
   "_shards": {
      "total": 5,
      "successful": 5,
      "failed": 0
   },
   "hits": {
      "total": 1,
      "max_score": 1,
      "hits": [
         {
            "_index": "movies",
            "_type": "movie",
            "_id": "AU1PIJgBA_0Cyshym7-m",
            "_score": 1,
            "_source": {
               "cast": [
                  {
                     "lastName": "Reeves",
                     "address": {
                        "city": "LA"
                     },
                     "firstName": "Keanu"
                  },
                  {
                     "middleName": "John",
                     "lastName": "Fishburne",
                     "address": {
                        "city": "NYC"
                     },
                     "firstName": "Laurence"
                  }
               ]
            }
         }
      ]
   }
}

您也可以选择排除字段,而不是同时包含或不包含两者,请参见此处的文档:http://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-source-filtering.html

10-02 03:35
查看更多