【问题标题】:ElasticSearch: search in two different ranges with different aggregations for eachElasticSearch:在两个不同的范围内搜索,每个范围都有不同的聚合
【发布时间】:2016-11-04 16:31:50
【问题描述】:

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

从“2016-10-01 到 2016-10-31”,我想对字段“orders.total_sales”(只是一个示例)和另一个和“reviews.count”求和。

从“2016-09-01 到 2016-09-30” 我只想总结“orders.total_sales”。

(事实上,我需要在第一个范围内进行 50 个总和聚合),但对于第二个范围,我只需要 2 个。

我知道可以使用 should 而不是 must 过滤两个范围的任何内容。但是是否可以区分每个范围的结果以便对其进行操作(聚合和)。

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

提前致谢。

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

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

    {
      "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】:

    我最终写了这样的东西(由于 ES 错误,直到我得到它的工作)

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

    {
      "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(我需要)和从最早的日期(第一个范围的开始日期)到最新的日期(结束第二个范围的日期),假设聚合与查询的结果一起工作(否则,它将搜索所有文档,让它对只获得一个的结果集进行聚合操作会很棒)。但是我是 ES 的新手,所以不确定我是否正确。然而,它的工作就像魅力! 非常感谢1

    【讨论】:

    • 你做得对,在更少的结果上聚合更快。
    猜你喜欢
    • 1970-01-01
    • 2018-11-28
    • 1970-01-01
    • 2013-09-14
    • 1970-01-01
    • 1970-01-01
    • 2021-08-01
    • 2016-07-03
    • 1970-01-01
    相关资源
    最近更新 更多