嵌套数组上的弹性搜索日期直方图聚合

时间:2014-12-02 11:51:48

标签: elasticsearch elasticsearch-plugin elasticsearch-jdbc-river spring-data-elasticsearch pyelasticsearch

以下是我的弹性搜索索引中的几个示例文档:

{
  message: "M1",
  date: "date object",
  comments: [
    {
     "msg" :"good"
     date:"date_obj1"
   },
   {
    "msg" :"bad"
     date:"date_obj2"
   },
   {
    "msg" :"ugly"
     date:"date_obj3"
   }
  ]
}

{
  message: "M2",
  date: "date_object5",
  comments: [
    {
     "msg" :"ugly"
     date:"date_obj7"
    },
    {
     "msg" :"pagli"
     date:"date_obj8"
    }
  ]
}

现在我需要每天查找一些文档和每天的评论数量。 我可以通过使用日期直方图获得每天的文档数量,它给出了正确的结果。我做了以下聚合查询

aggs : {
    "posts_over_days" : {
        "date_histogram" : { "field" : "date", "interval": "day" }
         }
    }

但是当我尝试类似的事情每天获得评论时,它会返回不正确的数据,(对于1500多条评论,它只会返回160条评论)。我正在进行以下查询:

aggs : {
    "comments_over_days" : {
        "date_histogram" : { "field" : "comments.date", "interval": "day" }
         }
    }

我想知道如何获得理想的结果?弹性搜索有没有办法得到我想要的东西? 如果我需要提供任何其他信息,请告诉我。

预期产出:

buckets: [
 {
   time_interval: date_objectA,
   doc_count: x
 },
  {
   time_interval: date_objectB,
   doc_count: y
 }
]

1 个答案:

答案 0 :(得分:3)

使用Value Count聚合 - 这将计算文档中字段的术语数。例如。根据您的数据(2篇文件中的5条评论):

curl -XGET 'http://localhost:9200/myindex/mydata/_search?search_type=count&pretty' -d '{
>    "aggs" : {
>         "grades_count" : { "value_count" : { "field" : "comments.date" } }
>     }
> }'
{
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 2,
    "max_score" : 0.0,
    "hits" : [ ]
   },
   "aggregations" : {
    "grades_count" : {
     "value" : 5
    }
  }
}

添加日期存储桶

Value Count聚合可以嵌套在日期桶中:

curl -XGET 'http://localhost:9200/myindex/mydata/_search?search_type=count&pretty' -d '{
  aggs : {
   "posts_over_days" : {
     "date_histogram" : { "field" : "date", "interval": "day" },
     "aggs" : {
         "grades_count" : { "value_count" : { "field" : "comments.date" } }
       }
     }
  }
}'

结果:

  "aggregations" : {
    "posts_over_days" : {
     "buckets" : [ {
        "key_as_string" : "2014-11-27T00:00:00.000Z",
        "key" : 1417046400000,
        "doc_count" : 1,
        "grades_count" : {
          "value" : 2
        }
      }, {
        "key_as_string" : "2014-11-28T00:00:00.000Z",
        "key" : 1417132800000,
        "doc_count" : 1,
        "grades_count" : {
          "value" : 3
        }
      }