2016-10-06 4 views
0

タイムスタンプフィールドの範囲を使用して弾性検索でクエリを作成しました。私は各グループの最新のタイムスタンプを見つける必要があります。最初にクエリを実行し、次に名前フィールドでグループ化し、最新のタイムスタンプを選択しようとします。しかし、それは動作していません。どんな提案も感謝しています。以下は、私は郵便配達からの検索後のクエリのために使用私のJSONがあるelasticsearch - 集計で最新のタイムスタンプを検索しようとしています

{ "クエリ":{ "範囲":{ "タイムスタンプ":{ "GTE": "2016-10-05T15:00:35" 、 "LTE": "2016-10-06T15:10:3​​5"}}} 、あなたはあなたの例のように、あなたはできる、それを行うためのtop-hits集約を使用することができます

"aggs" : { 
    "groupbyname" : { 
     "terms" : { 
      "field" : "name" 
      }, 
      "aggs" : { 
       "selectlatesttimestamp" : { 
       "max" : { 
        "field" : "timestamp" 
       } 
      } 
     } 

    } 
} 

}

答えて

0

次のようなことをしてください:

{ 
    "query": { 
    "range": { 
     "timestamp": { 
     "gte": "2016-10-05T15:00:35", 
     "lte": "2016-10-06T15:10:35" 
     } 
    } 
    }, 
    "aggs": { 
    "groupbyname": { 
     "terms": { 
     "field": "name" 
     }, 
     "aggs": { 
     "top_group_hits": { 
      "top_hits": { 
      "sort": [ 
       { 
       "timestamp": { 
        "order": "desc" 
       } 
       } 
      ], 
      "size": 1 
      } 
     } 
     } 
    } 
    } 
} 

クエリから発生した実際の結果を使用せずに集計のみを使用する場合は、"size":0をトップレベルオブジェクト("query"の上)に追加することもできます。

あなただけの一部のフィールドが必要な場合は、あなたの一番上に_sourceセクションを含めることができますあなただけがこのような何かを行うことができ、最新のタイムスタンプを取得する必要がある場合、たとえば、集計を打つ:

{ 
    "size": 0, 
    "query": { 
    "range": { 
     "timestamp": { 
     "gte": "2016-10-05T15:00:35", 
     "lte": "2016-10-06T15:10:35" 
     } 
    } 
    }, 
    "aggs": { 
    "groupbyname": { 
     "terms": { 
     "field": "name" 
     }, 
     "aggs": { 
     "top_group_hits": { 
      "top_hits": { 
      "sort": [ 
       { 
       "timestamp": { 
        "order": "desc" 
       } 
       } 
      ], 
      "_source": [ 
       "timestamp" 
      ], 
      "size": 1 
      } 
     } 
     } 
    } 
    } 
} 
+0

感謝それはうまくいくはずですが、なんらかの理由でその時間範囲で同じ名前の複数のドキュメントが返されています。私はそれがタイムスタンプを定義しているかそれをマッピングした方法で何か他のものであるかどうか疑問に思います。ここでJSONは、「名前」と「タイムスタンプ」を珍しく定義しなかった...「名前」:{ "type": "string" } "timestamp":{ "type": "date" 、 "形式": "strict_date_optional_time || epoch_millis" – BZelasky

+0

これは私の結果セットを取得する方法です。https://jsonblob.com/57f69a7ee4b0bcac9f7b677d私にはうまく見えますが、最新のタイムスタンプを持つグループごとに1つのドキュメントがあります。あなたの 'name'フィールドも' 'index ':" not_analyzed "'に設定する必要があります。それ以外の場合、Elasticsearchは内容をトークン化して余分なバケットを作成しますので、 'name:" new york "それは2つのバケツを表示します.1つは「新しい」と1つは「ヨーク」です。 –

関連する問題