gpt4 book ai didi

Elasticsearch - 2个字段的乘法然后求和聚合

转载 作者:行者123 更新时间:2023-11-29 02:51:23 26 4
gpt4 key购买 nike

我正在尝试在 elasticsearch 中进行简单查询,但我不知道该怎么做。我在网上找了一圈,也没有讨论过这种情况。

假设我有这样的元素:

{
"item_id": 1,
"item_price": 100,
"item_quantity": 2
},
{
"item_id": 2,
"item_price": 200,
"item_quantity": 3
},
{
"item_id": 3,
"item_price": 150,
"item_quantity": 1
},
{
"item_id": 4,
"item_price": 250,
"item_quantity": 5
}

我想进行查询以得到股票总价的结果。

例如:100*2 + 200*3 + 150*1 + 250*5

这个查询的结果应该是 2,200


最后一个数据的答案查询是有效的,但是这种复杂的情况呢:

POST tests/test2/
{
"item_category": "aaa",
"items":
[
{
"item_id": 1,
"item_price": 100,
"item_quantity": 2
},
{
"item_id": 2,
"item_price": 150,
"item_quantity": 4
}
]
}

POST tests/test2/
{
"item_category": "bbb",
"items":
[
{
"item_id": 3,
"item_price": 200,
"item_quantity": 3
},
{
"item_id": 4,
"item_price": 200,
"item_quantity": 5
}
]
}

POST tests/test2/
{
"item_category": "ccc",
"items":
[
{
"item_id": 5,
"item_price": 300,
"item_quantity": 2
},
{
"item_id": 6,
"item_price": 150,
"item_quantity": 8
}
]
}

POST tests/test2/
{
"item_category": "ddd",
"items":
[
{
"item_id": 7,
"item_price": 80,
"item_quantity": 10
},
{
"item_id": 8,
"item_price": 250,
"item_quantity": 4
}
]
}

在这种情况下,下一个查询不起作用并给我一个错误的答案(1,420 而不是 6,000):

GET tests/test2/_search
{
"query": {
"match_all": { }
},
"aggs": {
"total_price": {
"sum": {
"script": {
"lang": "painless",
"inline": "doc['items.item_price'].value * doc['items.item_quantity'].value"
}
}
}
}
}

最佳答案

您可以对使用 script 计算的值使用 sum 聚合

{
"aggs": {
"total_price": {
"sum": {
"script": {
"lang": "painless",
"inline": "doc['item_price'].value * doc['item_quantity'].value"
}
}
}
}
}

看这里https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-metrics-sum-aggregation.html#_script_9了解更多详情

更新

至于你的高级案例,最好将你的 items 字段映射为 nested 类型,之后你可以使用此聚合

{
"aggs": {
"nested": {
"nested": {
"path": "items"
},
"aggs": {
"total_price": {
"sum": {
"script": {
"inline": "doc['items.item_price'].value * doc['items.item_quantity'].value"
}
}
}
}
}
}
}

这是问题中示例数据库的映射查询:

PUT tests
{
"mappings": {
"test2": {
"properties": {
"items": {
"type": "nested"
}
}
}
}
}

澄清一下,您必须在创建索引之前进行映射查询。 (不允许更改现有字段的映射)。

关于Elasticsearch - 2个字段的乘法然后求和聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43508327/

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