簡體   English   中英

具有范圍查詢的彈性搜索聚合

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM