弹性搜索聚合与范围查询 [英] Elastic search aggregation with range query

查看:345
本文介绍了弹性搜索聚合与范围查询的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在努力构建一个满足条件> = avg的ES查询。

I am working to build a ES query that satisfies the condition >= avg .

这是一个例子:

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]",

我想知道我们如何在弹性查询中使用范围查询的汇总值

I wonder how do we use aggregated value with range query in Elastic query

推荐答案

不同的ES汇总,例如桶选择器,我发现它可以使用python。

After I tried using different ES aggregations such as bucket selector , I found that it can be done using python.

这是我创建的python代码来解决这个问题。
请注意:URL,USER_NAME,PASSWORD需要在运行前填写。

Here is the python code I created to solve this issue. Please note: URL , USER_NAME , PASSWORD needs to be filled before run it.

#! /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()

这篇关于弹性搜索聚合与范围查询的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆