次のオブジェクトにインデックスを付けています。
{ "ProjectName" : "Project 1",
"Roles" : [
{ "RoleName" : "Role 1", "AddedAt" : "2015-08-14T17:11:31" },
{ "RoleName" : "Role 2", "AddedAt" : "2015-09-14T17:11:31" } ] }
{ "ProjectName" : "Project 2",
"Roles" : [
{ "RoleName" : "Role 1", "AddedAt" : "2015-10-14T17:11:31" } ] }
{ "ProjectName" : "Project 3",
"Roles" : [
{ "RoleName" : "Role 2", "AddedAt" : "2015-11-14T17:11:31" } ] }
つまり、異なる役割が追加され、異なる時期に追加されたプロジェクトのリストです。 (役割リストはネストされたフィールドです)
私が必要とするのは、特定の役割ごとにいくつのプロジェクトが存在するかを選択する集計を行うことですが、特定の期間に役割がプロジェクトに追加された場合にのみ(!)。
従来のクエリ (日付ランデ フィルタリングなし) は次のようになります (そしてうまく機能します)。
{ // ... my main query here
"aggs" : {
"agg1" : {
"nested" : {
"path" : "Roles"
},
"aggs" : {
"agg2": {
"terms": {
"field" : "Roles.RoleName"
},
"aggs": {
"agg3":{
"reverse_nested": {}
}}}}}}
しかし、このアプローチは私にはうまくいきません。たとえば、「2015-09-01 」から始まる日付でフィルタリングする必要がある場合、最初のプロジェクト (つまり、プロジェクト「Role 2」のプロジェクトが「Role 2」の addedAt 日付基準のためにヒットするため、「Role 1」がヒットするためです。
したがって、次の条件をどこかに追加する必要があると思います。
"range": { "Roles.AddedAt": {
"gte": "2015-09-01T00:00:00",
"lte": "2015-12-02T23:59:59"
}}
しかし、私はそれを行う正しい方法を見つけることができません。
作業クエリの結果は (一種の) 次のとおりです。
"aggregations": {
"agg1": {
"doc_count": 17,
"agg2": {
"buckets": [
{
"key": "Role 1",
"doc_count": 2,
"agg3": {
"doc_count": 2
}
},
{
"key": "Role 2",
"doc_count": 2,
"agg3": {
"doc_count": 2
}
},