1

次のようなデータセットが与えられた場合

[{
    "type": "A",
    "value": 32
}, {
    "type": "A",
    "value": 34
}, {
    "type": "B",
    "value": 35
}]

次の集計を実行したいと思います。

  • まず、集約という用語を使用して、バケット内の「タイプ」でグループ化したいと思います。
  • その後、 extended_statsを使用してフィールド「値」のいくつかのメトリックを計算したいと思います。
  • std_deviation_bounds (上限と下限) を知っているので、範囲外のものを除いたバケットの要素の平均値を計算したいと思います [std_deviation_bounds.lower, std_deviation_bounds.upper]

リストの 1 番目と 2 番目のポイントは些細なことです。3 番目のポイントである、兄弟メトリック集計結果の情報を使用して、バケットの要素を除外し、平均を再計算することが可能かどうかを知りたいです。もしそうなら、使用する必要がある集計構造のヒントが欲しいです。

Elasticsearch インスタンスのバージョンは 5.0.0 です

4

1 に答える 1

0

さて、ここでOP。

元の質問で説明したように、ElasticSearch で集計を作成できるかどうかはまだわかりません。

この問題を解決するために私がしたことは、別のアプローチをとることです。他の人に役立つ場合に備えて、ここに投稿します。

それで、

POST hostname:9200/index/type/_search

{
    "query": {
        "match_all": {}
    },
    "size": 0,
    "aggs": {
        "group": {
            "terms": {
                "field": "type"
            },
            "aggs": {
                "histogramAgg": {
                    "histogram": {
                        "field": "value",
                        "interval": 10,
                        "offset": 0,
                        "order": {
                            "_key": "asc"
                        },
                        "keyed": true,
                        "min_doc_count": 0
                    },
                    "aggs": {
                        "statsAgg": {
                            "stats": {
                                "field": "value"
                            }
                        }
                    }
                },
                "extStatsAgg": {
                    "extended_stats": {
                        "field": "value",
                        "sigma": 2
                    }
                }
            }
        }
    }
}

このような結果が生成されます

{
    "took": 100,
    "timed_out": false,
    "_shards": {
        "total": 10,
        "successful": 10,
        "failed": 0
    },
    "hits": {
        "total": 100000,
        "max_score": 0.0,
        "hits": []
    },
    "aggregations": {
        "group": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0,
            "buckets": [{
                "key": "A",
                "doc_count": 10000,
                "histogramAgg": {
                    "buckets": {
                        "0.0": {
                            "key": 0.0,
                            "doc_count": 1234,
                            "statsAgg": {
                                "count": 1234,
                                "min": 0.0,
                                "max": 9.0,
                                "avg": 0.004974220783280196,
                                "sum": 7559.0
                            }
                        },
                        "10.0": {
                            "key": 10.0,
                            "doc_count": 4567,
                            "statsAgg": {
                                "count": 4567,
                                "min": 10.0,
                                "max": 19.0,
                                "avg": 15.544345993923,
                                "sum": 331846.0
                            }
                        },
                        [...]
                    }
                },
                "extStatsAgg": {
                    "count": 10000,
                    "min": 0.0,
                    "max": 104.0,
                    "avg": 16.855123857,
                    "sum": 399079395E10,
                    "sum_of_squares": 3.734838645273888E15,
                    "variance": 1.2690056384124432E9,
                    "std_deviation": 35.10540102369,
                    "std_deviation_bounds": {
                        "upper": 87.06592590438,
                        "lower": -54.35567819038
                    }
                }
            },
            [...]
            ]
        }
    }
}

type:"A" のグループ集約の結果に注意を払うと、ヒストグラムのすべてのサブグループの平均とカウントがあることに気付くでしょう。extStatsAgg集計 (ヒストグラム集計の兄弟)の結果にも、すべてのバケット グループ (タイプ:"A"、タイプ:"B"、...)のstd_deviation_boundsが示されていることに気付くでしょう。

お気づきかもしれませんが、これは私が探していた解決策を提供しません。コードでいくつかの計算を行う必要がありました。疑似コードの例

for bucket in buckets_groupAggregation

    Long totalCount = 0
    Double accumWeightedAverage = 0.0

    ExtendedStats extendedStats = bucket.extendedStatsAggregation
    Double upperLimit = extendedStats.std_deviation_bounds.upper
    Double lowerLimit = extendedStats.std_deviation_bounds.lower

    Histogram histogram = bucket.histogramAggregation
    for group in histogram

        Stats stats = group.statsAggregation

        if group.key > lowerLimit & group.key < upperLimit
            totalCount += group.count
            accumWeightedAverage += group.count * stats.average

    Double average = accumWeightedAverage / totalCount

注: ヒストグラム間隔のサイズによって、最終的な平均の「精度」が決まります。間隔を細かくすると、集計時間が長くなりますが、より正確な結果が得られます。

それが他の誰かに役立つことを願っています

于 2016-11-23T11:19:09.347 に答える