2017-09-24 8 views
1

Elasticsearchにはグループのログがあり、各グループには一意のID(transactionIdという名前)を共有する1-7のログが含まれています。各グループのすべてのログには一意のタイムスタンプ(eventTimestamp)があります。私は特定の日付範囲内transactionIdsのすべての最新のタイムスタンプのすべてを返すクエリを記述する必要が最新のタイムスタンプを持つログを一意のIDを持つグループから戻します

{ 
    "transactionId": "id111", 
    "eventTimestamp": "1505864112047", 
    "otherfieldA": "fieldAvalue", 
    "otherfieldB": "fieldBvalue" 
} 

{ 
    "transactionId": "id111", 
    "eventTimestamp": "1505864112051", 
    "otherfieldA": "fieldAvalue", 
    "otherfieldB": "fieldBvalue" 
} 

{ 
    "transactionId": "id222", 
    "eventTimestamp": "1505863719467", 
    "otherfieldA": "fieldAvalue", 
    "otherfieldB": "fieldBvalue" 
} 

{ 
    "transactionId": "id222", 
    "eventTimestamp": "1505863719478", 
    "otherfieldA": "fieldAvalue", 
    "otherfieldB": "fieldBvalue" 
} 

:たとえば

。これを達成するクエリを作成する方法について

{ 
    "transactionId": "id111", 
    "eventTimestamp": "1505864112051", 
    "otherfieldA": "fieldAvalue", 
    "otherfieldB": "fieldBvalue" 
} 

{ 
    "transactionId": "id222", 
    "eventTimestamp": "1505863719478", 
    "otherfieldA": "fieldAvalue", 
    "otherfieldB": "fieldBvalue" 
} 

任意のアイデア:

私の単純な例を続けると、クエリの結果は、これらのログを返す必要がありますか?

答えて

1

クエリ自体ではなく、terms aggregationと入れ子になったtop hits aggregationの組み合わせで、目的の結果を得ることができます。

用語集は、同じ用語を持つすべての項目が同じバケットにあるバケットを作成する役割を果たします。これはあなたのグループをtransactionIdごとに生成することができます。トップヒットアグリゲーションは、所定のソート順に従ってバケットのxヒットを返すように構成できるメトリック集約です。これにより、各バケットの最大のタイムスタンプを持つログイベントを取得できます。

GET so-logs/_search 
{ 
    "size": 0, 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "range": { 
      "eventTimestamp.keyword": { 
       "gte": 1500000000000, 
       "lte": 1507000000000 
      } 
      } 
     } 
     ] 
    } 
    }, 
    "aggs": { 
    "by_transaction_id": { 
     "terms": { 
     "field": "transactionId.keyword", 
     "size": 10 
     }, 
     "aggs": { 
     "latest": { 
      "top_hits": { 
      "size": 1, 
      "sort": [ 
       { 
       "eventTimestamp.keyword": { 
        "order": "desc" 
       } 
       } 
      ] 
      } 
     } 
     } 
    } 
    } 
} 

は、次の出力が生成されます:()非分析されたテキストなどの文字列がthekey(テキスト)とthekey.keywordとしてインデックス付けされている()は、このクエリをあなたのサンプルデータのデフォルトのマッピングを仮定し

:クエリで定義された集合名に応じて集計結果by_transaction_id.latestの内部で望ましい結果を見つけることができます

{ 
    "took": 7, 
    "timed_out": false, 
    "_shards": { 
    "total": 5, 
    "successful": 5, 
    "failed": 0 
    }, 
    "hits": { 
    "total": 4, 
    "max_score": 0, 
    "hits": [] 
    }, 
    "aggregations": { 
    "by_transaction_id": { 
     "doc_count_error_upper_bound": 0, 
     "sum_other_doc_count": 0, 
     "buckets": [ 
     { 
      "key": "id111", 
      "doc_count": 2, 
      "latest": { 
      "hits": { 
       "total": 2, 
       "max_score": null, 
       "hits": [ 
       { 
        "_index": "so-logs", 
        "_type": "entry", 
        "_id": "AV6z9Yj4QYbhNp_FoXa1", 
        "_score": null, 
        "_source": { 
        "transactionId": "id111", 
        "eventTimestamp": "1505864112051", 
        "otherfieldA": "fieldAvalue", 
        "otherfieldB": "fieldBvalue" 
        }, 
        "sort": [ 
        "1505864112051" 
        ] 
       } 
       ] 
      } 
      } 
     }, 
     { 
      "key": "id222", 
      "doc_count": 2, 
      "latest": { 
      "hits": { 
       "total": 2, 
       "max_score": null, 
       "hits": [ 
       { 
        "_index": "so-logs", 
        "_type": "entry", 
        "_id": "AV6z9ZlOQYbhNp_FoXa4", 
        "_score": null, 
        "_source": { 
        "transactionId": "id222", 
        "eventTimestamp": "1505863719478", 
        "otherfieldA": "fieldAvalue", 
        "otherfieldB": "fieldBvalue" 
        }, 
        "sort": [ 
        "1505863719478" 
        ] 
       } 
       ] 
      } 
      } 
     } 
     ] 
    } 
    } 
} 

集計という用語には、返されるバケットの数に制限があり、これを> 10.000と設定することは、パフォーマンスの観点からは賢明ではないと思われることに注意してください。詳細は、the section on size of the terms aggregationを参照してください。膨大な量の異なるトランザクションIDを扱う場合は、トランザクションIDで「トップ」エントリのいくつかの冗長ストレージを行うことをお勧めします。

また、より良いパフォーマンスとa wider set of query possibilitiesのために、eventTimestampフィールドをdateに切り替える必要があります。