[英]Elastic search aggregation with range query
我正在努力建立一個滿足條件> = 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]",
我想知道我們如何在Elastic查詢中將聚合值與范圍查詢一起使用
您不能將聚合嵌入查詢中。 您需要首先發送聚合查詢以找出平均值,然后使用獲得的平均值發送第二個范圍查詢。
查詢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
}
}
}
}
}
}
在嘗試使用不同的ES聚合(例如存儲桶選擇器)后 ,我發現可以使用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()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.