gpt4 book ai didi

php - Elastica在setScript之前未对聚合进行分组

转载 作者:行者123 更新时间:2023-12-03 00:52:05 27 4
gpt4 key购买 nike

我在Elasticsearch中有一个类型产品,其中包含一个包含多个ID的列,其中一些是相同的。
也有包含当前价格和数量的列。我希望获得每个唯一ID的价格* qte的总和。

id    price    qte
__ _____ _________

1 25 4
1 25 4
1 25 4
2 38 2
2 38 2
3 12 3
3 12 3
3 12 3
3 12 3
4 33 6
5 64 8
5 64 8

(如果您想知道为什么会这样,那是因为还有其他列,每个列的值都不同,还请注意,每个唯一ID都有唯一的价格和数量)

所以我创建了聚合:
$id = new \Elastica\Aggregation\Terms('id');
$id->setField('id')->setSize(0);

$qte_price = new \Elastica\Aggregation\Sum('qte_price');
$qte_price->setScript('doc["price"].value * doc["qte"].value');

$id->addAggregation($qte_price);

这里的问题是, qte_price在执行 id之前不使用 setScript()的第一个聚合,因此将所有id甚至重复的id的 price * qte的总和求和。

换句话说,我想计算 id=1 => 25*4(而不是 (25*4)*3id=2 => 38*2(而不是 (38*2)*2) ..等等)

我发现解决此问题的技巧是将答案除以doc_count,但我正在寻找使用Elastica的官方方法。

最佳答案

我将对avgprice字段都使用qte聚合,然后使用 bucket_script pipeline aggregation将平均价格乘以平均数量,这将达到您的期望。

3 * 25的平均值是25,3 * 4的平均值是4,那么您可以将25乘以4,得到id = 1的答案...其他id也一样。

在纯DSL中,它看起来像这样:

{
"size": 0,
"aggs": {
"by_id": {
"terms": {
"field": "id"
},
"aggs": {
"avg_price": {
"avg": {
"field": "price"
}
},
"avg_qte": {
"avg": {
"field": "qte"
}
},
"price_by_qte": {
"bucket_script": {
"buckets_path": {
"avgPrice": "avg_price",
"avgQte": "avg_qte"
},
"script": "params.avgPrice * params.avgQte"
}
}
}
}
}
}

用Elastica表示,它会像这样:
$id = new \Elastica\Aggregation\Terms('id');
$id->setField('id')->setSize(0);

$avg_price = new \Elastica\Aggregation\Avg('avg_price');
$avg_price->setField('price');
$id->addAggregation($avg_price);

$avg_qte = new \Elastica\Aggregation\Avg('avg_qte');
$avg_qte->setField('qte');
$id->addAggregation($avg_qte);

$bucketScriptAggregation = new BucketScript(
'price_by_qte',
[
'avgPrice' => 'avg_price',
'avgQte' => 'avg_qte',
],
'params.avgPrice * params.avgQte'
);
$id->addAggregation($bucketScriptAggregation);

关于php - Elastica在setScript之前未对聚合进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51704079/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com