2.3

2016-08-12 10 views
1

私は、インデックスのスキーマ次いる弾性検索に集約後のフィールドを選択する方法: -2.3

PUT 
    "mappings": { 
     "event": { 
      "properties": { 
      "@timestamp": { "type": "date", "doc_values": true}, 
      "partner_id": { "type": "integer", "doc_values": true}, 
      "event_id": { "type": "integer", "doc_values": true}, 
      "count": { "type": "integer", "doc_values": true, "index": "no" }, 
      "device_id": { "type": "string", "index":"not_analyzed","doc_values":true } 
      "product_id": { "type": "integer", "doc_values": true}, 
      } 
     } 
     } 

は、私は次のクエリと同等の結果必要があります: -

SELECT product_id, device_id, sum(count) FROM index WHERE partner_id=5 AND timestamp<=end_date AND timestamp>=start_date GROUP BY device_id,product_id having sum(count)>1; 

私は達成することができています -

GET 
{ 
    "store": true, 
    "size":0, 
    "aggs":{ 
     "matching_events":{ 
      "filter":{ 
       "bool":{ 
        "must":[ 
         { 
          "term":{ 
           "partner_id":5 
          } 
         }, 
         { 
          "range":{ 
           "@timestamp":{ 
            "from":1470904000, 
            "to":1470904999 
           } 
          } 
         } 
        ] 
       } 
      }, 
      "aggs":{ 
         "group_by_productid": { 
         "terms":{ 
         "field":"product_id" 
        }, 
      "aggs":{ 
       "group_by_device_id":{ 
        "terms":{ 
         "field":"device_id" 
        }, 
        "aggs":{ 
         "total_count":{ 
          "sum":{ 
           "field":"count" 
          } 
         }, 
         "sales_bucket_filter":{ 
          "bucket_selector":{ 
           "buckets_path":{ 
            "totalCount":"total_count" 
           }, 
           "script": {"inline": "totalCount > 1"} 
          } 
         } 
        } 
        }} 
       } 
      } 
     } 
    } 

}' 

count is <=1クエリが返されている場合鍵付きの空のバケットはproduct_idです。今4000万人のグループのうち、100万人だけが条件を満たしているので、大部分が無駄な巨大な結果セットで返されます。集計後に特定のフィールドのみを選択するにはどうすればよいですか?

- :私は、データのセットを、以下のいる

:[ "aggregations.matching_events.group_by_productid.group_by_device_id.buckets.key"]

編集:私はこれが、working-ない ` "フィールド" を試してみました

device id Partner Id Count db63te2bd38672921ffw27t82 367 3 db63te2bd38672921ffw27t82 272 1 

私はこの出力を行く: -

{ 

    "took":6, 
    "timed_out":false, 
    "_shards":{ 
     "total":5, 
     "successful":5, 
     "failed":0 
    }, 
    "hits":{ 
     "total":7, 
     "max_score":0.0, 
     "hits":[ 
     ] 
    }, 
    "aggregations":{ 
     "matching_events":{ 
      "doc_count":5, 
      "group_by_productid":{ 
       "doc_count_error_upper_bound":0, 
       "sum_other_doc_count":0, 
       "buckets":[ 
        { 
         "key":367, 
         "doc_count":3, 
         "group_by_device_id":{ 
          "doc_count_error_upper_bound":0, 
          "sum_other_doc_count":0, 
          "buckets":[ 
           { 
            "key":"db63te2bd38672921ffw27t82", 
            "doc_count":3, 
            "total_count":{ 
             "value":3.0 
            } 
           } 
          ] 
         } 
        }, 
        { 
         "key":272, 
         "doc_count":1, 
         "group_by_device_id":{ 
          "doc_count_error_upper_bound":0, 
          "sum_other_doc_count":0, 
          "buckets":[ 
          ] 
         } 
        } 
       ] 
      } 
     } 
    } 

} 

あなたが見ることができるように、キー272とバケットは理にかなっている空ですが、必要がありません、このバック結果セット全体から削除されますか?

+0

あなたは 'top_hits'集約を試みたことがありますか? –

+0

しかし、私はtop_hitが最良の一致する文書を返すと理解しています。私にとって、マッチングは真偽です - はい、いいえ。マッチがあればスコアはないはずです。私は完全にそれを理解していないかもしれません! –

+0

私は要件を理解していないと思う。 'sales_bucket_filter'の結果が空の' group_by_device_id'バケットを除外したいのです(つまり、サブバケットはすでにフィルタされています)。 –

答えて

1

buckets_pathオプションに_bucket_countのパスを追加して、かなり新しい問題とPRがあることを知りました。これにより、集約は、別の集約が持つバケットの数に基づいて親バケットをフィルタリングする可能性があります。つまり、親の_bucket_countが0の場合、bucket_selectorはバケットを削除する必要があります。

これはgithubの問題です:https://github.com/elastic/elasticsearch/issues/19553

+0

素晴らしいですが、私はそれがバージョン2.3の一部ではないことを理解していますか? –

+0

はい、ES 5で利用可能です。 –

関連する問題