0

我正在构建一个满足条件 >= 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]",

我想知道我们如何在弹性查询中使用聚合值和范围查询

4

2 回答 2

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
          }
        }
      }
    }
  }
}
于 2016-03-16T04:01:38.380 回答
0

在我尝试使用不同的 ES 聚合(例如bucket selector)后,我发现它可以使用 python 来完成。

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

#! /usr/bin/python
import sys,json,requests
from requests.auth import HTTPBasicAuth

# static variables
URL=''
USER_NAME=''
PASSWORD=''

# returns avg value 
def getAvg():
    query = json.dumps({
        "aggs": {
            "single_avg_price": {
              "avg": {
                "field": "price"
              }
            }
         }
    })
    response = requests.get(URL,auth=HTTPBasicAuth(USER_NAME,PASSWORD), data=query)
    results = json.loads(response.text)
    return results['aggregations']['single_avg_price']['value']

#returns rows that are greater than avg value 
def rows_greater_than_avg(avg_value):
    query = json.dumps({
     "query" : {
        "range": {
            "price": {
                "gte":avg_value
              }
         }
      }
    })
    response = requests.get(URL,auth=HTTPBasicAuth(USER_NAME,PASSWORD), data=query)
    results = json.loads(response.text)
    return results

# main method
def main():
   avg_value = getAvg()
   print( rows_greater_than_avg(avg_value))

main()
于 2016-03-17T20:37:49.157 回答