首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ElasticSearch:在两个不同的区域中进行搜索,每个区域具有不同的聚合

ElasticSearch:在两个不同的区域中进行搜索,每个区域具有不同的聚合
EN

Stack Overflow用户
提问于 2016-11-04 16:31:50
回答 2查看 77关注 0票数 1

这是一个奇怪的问题,但我试图避免两次调用ES来从两次不同的时间获取不同的数据。我们可以这么说:

从"2016-10-01到2016-10-31“,我想把字段"orders.total_sales”(只是一个例子)和另一个总和"reviews.count“相加。

从"2016-09-01到2016-09-30“,我只想把"orders.total_sales”和起来。

(事实上,我需要第一个区间的50和总和),但对于第二个范围,我只需要2)。

我知道它可以过滤两个范围内的任何使用应该而不是必须。但是,是否有可能将结果与每个范围区分开来,以便与它们一起操作(汇总和)。

我认为这是不可能的,但以防万一以前有人提出过这个问题。

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-04 17:46:07

为此,您可以使用过滤聚合。基本上,您将为两个不同的范围编写两个过滤器,然后根据您的需要进行子聚合。

代码语言:javascript
运行
复制
{
  "size": 0,
  "aggs": {
    "range_one": {
      "filter": {
        "range": {
          "your_date_field": {
            "gte": "2016-01-01",
            "lte": "2016-02-02"
          }
        }
      },
      "aggs": {
        "sum_orders": {
          "sum": {
            "field": "your_sum_field1"
          }
        }
      }
    },
    "range_two": {
      "filter": {
        "range": {
          "your_date_field": {
            "gte": "2016-02-01",
            "lte": "2016-03-02"
          }
        }
      },
      "aggs": {
        "sum_orders": {
          "sum": {
            "field": "your_sum_field2"
          }
        }
      }
    }
  }
}
票数 2
EN

Stack Overflow用户

发布于 2016-11-04 20:18:35

最后我写了这样的东西(由于ES错误,直到我开始工作)。

非常感谢!它起作用了,但不适用于过滤器,但我的想法是一样的,我做了这样的事情:

代码语言:javascript
运行
复制
{
  "timeout" : 1500,
  "query" : {
    "bool" : {
      "must" : [
        {
          "term" : {
            "businessId" : "101598"
          }
        }  ,
        {
          "range" : {
            "date" : {
              "from" : "2016-10-15T03:00:00.000Z",
              "to" : "2016-10-31T03:00:00.000Z",
              "include_lower" : true,
              "include_upper" : true
            }
          }
        }]
    }
  },
  "aggs": {
    "range_one": {
      "date_range": {
        "field": "date",
        "ranges": [
          {
            "from": "2016-10-15T03:00:00.000Z",
            "to": "2016-10-22T03:00:00.000Z" 
          }
        ]
      },
      "aggs": {
        "sum_orders_sales": {
          "sum": {
            "field": "orders.totalSales"
          }
        }
      }
    },
    "range_two": {
      "date_range": {
        "field": "date",
        "ranges": [
          {
            "from": "2016-10-23T03:00:00.000Z",
            "to": "2016-10-31T03:00:00.000Z" 
          }                    
        ]
      },
      "aggs": {
        "sum_orders_count": {
          "sum": {
            "field": "orders.orderCount"
          }
        }
      }
    }
  }
}

在我的情况下,性能和速度很重要,而且由于我的两个范围是连续的,所以我认为我可以通过business_id (我需要)过滤,从最老的日期(第一个范围的开始日期)到最新的日期(第二个范围的结束日期),假设聚合与查询的结果一起工作(否则,它将搜索所有文档,如果只对一个结果集执行聚合操作,那么就好了)。但我是新来的,所以不确定我看得对不对。然而,它的工作就像魅力!谢谢lot1

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40427594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档