带范围查询的弹性搜索聚合

时间:2016-03-15 19:00:53

标签: elasticsearch querydsl sense

我正在构建一个满足条件> = avg。

的ES查询

以下是一个例子:

GET /_search
{
    "size" : 0,
    "query" : {
        "filtered": {
            "filter": {
                "range": {
                    "price": {
                        "gte": {
                          "aggs" : {
                            "single_avg_price": {
                                "avg" :{ 
                                  "field" : "price" 
                                }
                              }
                            }
                          }
                }
            }
        }
    }
    }
}

我收到以下错误

"type": "query_parsing_exception",
"reason": "[range] query does not support [aggs]",

我想知道如何在弹性查询

中使用聚合值和范围查询

2 个答案:

答案 0 :(得分:1)

您无法在查询中嵌入聚合。您需要首先发送聚合查询以找出平均值,然后使用获得的平均值发送第二个范围查询。

查询1:

POST /_search
{
  "size": 0,
  "aggs": {
    "single_avg_price": {
      "avg": {
        "field": "price"
      }
    }
  }
}

然后你得到平均价格,比如它是12.3并在你的第二个查询中使用它,如下所示:

查询2:

POST /_search
{
  "size": 10,
  "query": {
    "filtered": {
      "filter": {
        "range": {
          "price": {
            "gte": 12.3
          }
        }
      }
    }
  }
}

答案 1 :(得分:0)

尝试使用bucket selector等不同的ES聚合后,我发现可以使用python完成。

这是我为解决此问题而创建的python代码。 请注意:在运行之前,需要填写网址,USER_NAME,PASSWORD。

 "eslintConfig": {
    "env": {
      "es6": true,
      "node": true,
      "browser": true
    },
    "rules": {
      "quotes": [
        2,
        "single"
      ]
    }
  }