如何创建包含结果中嵌套数据的elasticsearch查询

时间:2016-06-07 09:39:45

标签: elasticsearch nested

我需要从包含嵌套数据的elasticsearch查询中获取数据。 数据源设置为true。添加'字段'

"fields":["*"],
"query": {
...

返回根级别的所有数据。

但我需要获取嵌套文档中的数据(实际上是嵌套的嵌套文档)。 使用_source和具有嵌套对象引用的字段

"fields":["products.envs.title"],
到目前为止没有喜悦。 任何人都知道如何将这些数据作为查询的一部分。 查询包括聚合,并且返回正常,但也需要将嵌套数据作为结果的一部分,以便我可以检查标志并返回依赖于标志调用的数据。

1 个答案:

答案 0 :(得分:1)

您没有指定映射和对象结构,所以我创建了自己的映射,如下所示:

POST /so/so/1
{
   "id": 1,
   "user": {
      "name": "adam",
      "role": {
         "code": "admin"
      }
   }
}

现在让我们尝试使用fields参数查询数据并剪切返回结果 查询:

POST /so/so/_search
{
   "fields": [
      "id",
      "user.role.code"
   ],
   "query": {
      "match_all": {}
   }
}

结果:

"hits": {
      "total": 1,
      "max_score": 1,
      "hits": [
         {
            "_index": "so",
            "_type": "so",
            "_id": "1",
            "_score": 1,
            "fields": {
               "user.role.code": [
                  "admin"
               ],
               "id": [
                  1
               ]
            }
         }
      ]
   }

正如您所看到的,一切正常。问题是如果你想告诉你要返回像“user”或“user.role”这样的整个对象,那么你将得到“field [X]不是叶子字段”异常。唯一的解决方案是停止使用fields参数并开始使用_source参数来剪切数据 - 此问题在此处描述:https://github.com/elastic/elasticsearch/issues/4888。另外,建议不要使用fields参数,并且应始终使用_source参数,如下所示 查询:

POST /so/so/_search
{
   "_source": [
      "id",
      "user.role.code"
   ],
   "query": {
      "match_all": {}
   }
}

响应:

 "hits": {
      "total": 1,
      "max_score": 1,
      "hits": [
         {
            "_index": "so",
            "_type": "so",
            "_id": "1",
            "_score": 1,
            "_source": {
               "id": 1,
               "user": {
                  "role": {
                     "code": "admin"
                  }
               }
            }
         }
      ]
   }