2

以下は、elasticsearch インデックスのサンプル ドキュメントです。

{
  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"
    }
  ]
}

ここで、1 日あたりのドキュメント数と 1 日あたりのコメント数を見つける必要があります。日付ヒストグラムを使用して 1 日あたりのドキュメント数を取得でき、正しい結果が得られます。次の集計クエリを作成します

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

しかし、同様のことを 1 日あたりのコメントを取得しようとすると、正しくないデータが返されます (1500 件以上のコメントの場合、160 件の奇妙なコメントしか返されません)。次のクエリを作成しています。

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

希望する結果を得る方法を知りたいですか? 私が欲しいものを得るためにelasticsearchに方法はありますか? 他の情報を提供する必要がある場合はお知らせください。

期待される出力:

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

1 に答える 1

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
        }
      } 
于 2014-12-02T13:35:05.057 に答える