Elastic总是在简单聚合上返回0个桶,在嵌套

时间:2017-09-09 17:12:08

标签: elasticsearch

我正在从SOLR迁移到Elasticsearch,并努力让聚合工作正常。

在我的索引中有一个单个文档,类似于以下json结构:

{
      "id": 1,
      "title": "some title",
      "profile": {
        "colour": "GREY",
        "brand": "SOME_BRAND",
      },
      "user_id": 1,
      "created_at": "2017-09-09T13:54:30.304Z",
      "updated_at": "2017-09-09T13:54:50.282Z",
      "email": "john@example.com",
}

可以使用以下方式查询我的文档:

GET /index/_search
{
  "query": {
    "match_all": {}
  }
}

我想(出于某种原因)仅在电子邮件上聚合。所以我用:

GET /index/_search
{
  "query": {
    "match_all": {}
  },
  "aggs": {
    "emails": {
    "terms": {
      "field": "email"
    }
   }
  }
}

如果我要使用SOLR执行此操作,我会收到有关单个文档的电影地址john@example.com的方面。

然而弹性回归:

{
  **SNIP**
 "aggregations": {
   "emails": {
     "doc_count_error_upper_bound": 0,
     "sum_other_doc_count": 0,
     "buckets": []
   }
  }
}

我还想检索散列上的聚合,例如个人资料['颜色']

我试过了:

GET /index/_search
{
  "query": {
    "match_all": {}
  },
  "aggs": {
    "profile_colour": {
    "terms": {
      "field": "profile",
      "scripts": {
          "inline": "doc.profile.colour"
      }
    }
   }
  }
}

但是结果再次为零。似乎我尝试的每件事都没有聚合。我在这里错过了一些非常简单的东西..

1 个答案:

答案 0 :(得分:1)

您的JSON文档格式错误,请删除此处的逗号

"brand": "SOME_BRAND",

在这里

"email": "john@example.com",

一切都会奏效(至少在这里,我在ES 1.7.3上)。请注意,在以下示例中,我没有为这些字段创建指定映射:

"aggregations": {
    "emails": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "example.com",
          "doc_count": 1
        },
        {
          "key": "john",
          "doc_count": 1
        }
      ]
    }
  }

我认为这是错误的,因为整个电子邮件应该作为单个关键字进行管理。