如何解决最大总和查询不适用于弹性搜索
我正在尝试通过 elasticsearch 找到特定时期内的最大销售额。但是,由于某种原因,我的查询没有找到最大销售额。这是我提出的查询:
GET stock/_search
{
"size": 0,"aggs": {
"sales_per_product": {
"terms": {
"field": "offer.product.id","order": {
"sum_sales": "desc"
},"size": 1
},"aggs": {
"sum_sales": {
"sum": {
"field": "sales"
}
}
}
}
}
}
此查询在我的示例中给出以下响应:
"buckets" : [{
"key" : 241630,"doc_count" : 67,"sum_sales" : {
"value" : 1621.0
}
}]
但是,最大销售额实际上是 1733,这可以在以下查询示例中看到:
GET stock/_search
{
"size": 0,"query": {
"bool": {
"filter": [
{
"term": {
"offer.product.id": "241630"
}
}
]
}
},"aggs": {
"sum_sales": {
"sum": {
"field": "sales"
}
}
}
}
}
}
结果:
"buckets" : [{
"key" : 241630,"doc_count" : 73,"sum_sales" : {
"value" : 1733.0
}
}]
我不明白我最初的查询有什么问题。有什么我遗漏的吗?
我通过增加一个更大的尺寸来解决这个问题,从 1 到 100。但是没有更好的方法。如何保证我将来不需要使用更大的存储桶? (因为更大的存储桶大小会大大降低性能)
解决方法
由于分片数大于1,这是elasticsearch的正常行为。当分片数大于 1 时,elasticsearch 分别对每个分片进行 aggs,得到总结果的前 x
个,发送到主节点进行最终计算。您可以在 shard_size
部分看到它 here。默认情况下,此 x
的大小为 *1.5 +10。
这意味着当您以 10 的大小运行 terms
aggs
时,每个分片会返回 25 个桶。可能在第一个分片的前 25 个结果中有存储桶,但它不在第二个分片的前 25 个结果中。因此,aggs
结果并不完全准确。为了更准确,您可以增加shard_size
。它肯定会对您的执行时间产生负面影响。为此,您可以将该行添加到您的查询中:
aggs:{
"sales_per_product": {
"terms": {
"field": "offer.product.id","size": 1,"shard_size": 30
}
}
}
,
我通过为 elasticsearch 使用 pivot transform 解决了这个问题。
我对产品的转换进行了分组,并有一个名为 sum_sales 的字段,它是销售额的总和。这样做使我能够在字段上使用普通过滤器,从而为我提供准确的解决方案。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。