ESマルチキー重合バケツ個数カウント問題
4457 ワード
ESマルチキー重合バケツ個数カウント問題
開発検証では,ElasticSearchが集約されたときにバケツの個数が表示されず,データ照合を行う際に非常に面倒であった.ここにはいくつかの解決策があります.
JAvaコードのカウント
JAvaコードでクエリーを送信するとresponseが返され、bucketsは配列であり、配列のサイズ、すなわち集約バケツの数を取得できます.この解決策が噴き出される可能性があることを知っています.
ESクエリー文の使用数
termsを使用してscriptを追加する利点は、単一キーで集約してもよいし、マルチキーで集約してもよいことです.戻り値の例:
ここでkeyの構造は、書くdoc["order_id"]である.value+’-split-’+doc[‘merchant_id’].value形式.中括弧内の引用符にはキー値が含まれています.
本題に戻り、戻り結果全体のバケツ数をどのようにカウントしますか?
補助手段を用いて,クエリ結果にkey個数のカウントを1として構築し,このカウントをまとめることができる.直接クエリ文:
重点は集約バケツの外部にもう一つのバケツの数の集約がある:集約バケツのクエリー文にkey次元の集約を追加し、cardinalityを行って重くするので、個々のバケツごとにkeyは1つしかなく、ここで集約結果は1にすぎない.次にkey「uniqueId」を二次要約集約し、この要約はバケツの個数である.クエリの結果は次のとおりです.
keycountのvalueはどれだけのバケツがあるか、uniqueIdの値が1であることもわかります.ここで唯一の欠点は、クエリー時に集約されるsize値が十分に大きいことです.私のクエリーは200に設定され、最後の結果は3つのバケツしかなく、すべてのバケツのカウントは3です.しかし、バケツの数が200個を超えると、200個のバケツが表示され、カウントは200です.すなわち、バケツカウントは、クエリーされたバケツの個数に基づいており、すべてのバケツの個数を表示する場合、表示される集約バケツの個数は、バケツ集約結果の個数よりも大きく設定されている.
開発検証では,ElasticSearchが集約されたときにバケツの個数が表示されず,データ照合を行う際に非常に面倒であった.ここにはいくつかの解決策があります.
JAvaコードのカウント
JAvaコードでクエリーを送信するとresponseが返され、bucketsは配列であり、配列のサイズ、すなわち集約バケツの数を取得できます.この解決策が噴き出される可能性があることを知っています.
ESクエリー文の使用数
GET cn_order*/_search
{
"size":0,
"aggregations": {
"groupby": {
"terms": {
"script": {
"inline": "doc['order_id'].value+'-split-'+doc['merchant_id'].value"
},
"size": 200
},
"aggregations": {
"marketFee": {
"sum": {
"field": "market_fee"
}
}
}
}
}
}
termsを使用してscriptを追加する利点は、単一キーで集約してもよいし、マルチキーで集約してもよいことです.戻り値の例:
{
"took": 2,
"timed_out": false,
"_shards": {
"total": 90,
"successful": 90,
"failed": 0
},
"hits": {
"total": 4,
"max_score": 0,
"hits": []
},
"aggregations": {
"groupby": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"doc_count": 2,
"marketFee": {
"value": 4.2
},
"key": "1437002_76-split-123”
},
{
"doc_count": 1,
"marketFee": {
"value": 2.1
},
"key": "1437002_77-split-234”
},
{
"doc_count": 1,
"marketFee": {
"value": 2.1
},
"key": “123_7759-split-345”
}
]
}
}
}
ここでkeyの構造は、書くdoc["order_id"]である.value+’-split-’+doc[‘merchant_id’].value形式.中括弧内の引用符にはキー値が含まれています.
本題に戻り、戻り結果全体のバケツ数をどのようにカウントしますか?
補助手段を用いて,クエリ結果にkey個数のカウントを1として構築し,このカウントをまとめることができる.直接クエリ文:
GET cn_energy_charge_bill*/_search
{
"size": 0,
"aggregations": {
“keycount": {
"sum_bucket": {
"buckets_path": "groupby>uniqueId"
}
},
"groupby": {
"terms": {
"script": {
"inline": "doc[‘order_id'].value+'-split-'+doc[’merchant_id’].value"
},
"size": 200
},
"aggregations": {
"marketFee": {
"sum": {
"field": "market_fee"
}
},
"uniqueId": {
"cardinality":{
"script": {
"inline": "doc[‘order_id'].value+'-split-'+doc[‘merchant_id’].value"
}
}
}
}
}
}
}
重点は集約バケツの外部にもう一つのバケツの数の集約がある:集約バケツのクエリー文にkey次元の集約を追加し、cardinalityを行って重くするので、個々のバケツごとにkeyは1つしかなく、ここで集約結果は1にすぎない.次にkey「uniqueId」を二次要約集約し、この要約はバケツの個数である.クエリの結果は次のとおりです.
{
"took": 2,
"timed_out": false,
"_shards": {
"total": 90,
"successful": 90,
"failed": 0
},
"hits": {
"total": 4,
"max_score": 0,
"hits": []
},
"aggregations": {
"keycount": {
"value": 3
},
"aggregations": {
"groupby": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"doc_count": 2,
"marketFee": {
"value": 4.2
},
"key": "1437002_76-split-123”
},
{
"doc_count": 1,
"marketFee": {
"value": 2.1
},
"key": "1437002_77-split-234”
},
{
"doc_count": 1,
"marketFee": {
"value": 2.1
},
"key": “123_7759-split-345”,
"uniqueId": {
"value": 1
}
}
]
}
}
}
keycountのvalueはどれだけのバケツがあるか、uniqueIdの値が1であることもわかります.ここで唯一の欠点は、クエリー時に集約されるsize値が十分に大きいことです.私のクエリーは200に設定され、最後の結果は3つのバケツしかなく、すべてのバケツのカウントは3です.しかし、バケツの数が200個を超えると、200個のバケツが表示され、カウントは200です.すなわち、バケツカウントは、クエリーされたバケツの個数に基づいており、すべてのバケツの個数を表示する場合、表示される集約バケツの個数は、バケツ集約結果の個数よりも大きく設定されている.