ESマルチキー重合バケツ個数カウント問題


ESマルチキー重合バケツ個数カウント問題
開発検証では,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です.すなわち、バケツカウントは、クエリーされたバケツの個数に基づいており、すべてのバケツの個数を表示する場合、表示される集約バケツの個数は、バケツ集約結果の個数よりも大きく設定されている.