python elasticsearch高级组合查询及aggs聚合

这两天和小朋友对elasticsearch进行死逼…  主要是纠结,我今天就上两个例子……  

如果你的查询较为复杂就直接套用这个格式,shold里面的逻辑都是OR , must_not是非,must是必须要有的。 

关于elasticsearch 组合查询和aggs聚合查询。补充更新地址是,http://xiaorui.cc/?p=2016


"bool": {
"should": [],
"must_not": [
   
],
"must": []
}

下面的例子是说 ,查询A时间到B时间内,有多少关于sina的数据.

{   "size":1,
    "query": {
        "filtered": {
        "query": {
         "regexp": {
           "url": ".*sina.com.cn.*"
         }
       },  
            "filter": {
                "bool": {
                    "should": [],
                    "must_not": [
                       
                    ],
                    "must": [
                        {
                         "term": {
                             
                                "keyword":"宝马"
                            }
                            
                        },
                          


                        {
                            "range": {
                                "idate": {
                                    "gte": "2015-08-01T00:00:00",
                                    "lte": "2015-08-20T00:00:00"
                                    
                                }
                            }
                        }
                   
                    ]
                }
            }
        }
    }
}

这是一个利用aggs进行周期聚合的例子,计算字段是idate,interval是每个月

{
  "aggs" : {
    "my_upload_time_histogram" : {
      "date_histogram" : {
        "field" : "idate",
        "interval" : "1M",
        "format" : "yyyy-MM-dd"
      }
    }
  }
}'

当然在线上业务中会遇到各种各样的查询,但是在官网上没找到较完整的例子,所以就从kibana request里找了找,我自己觉得kibana的语法实用很丰富,下面的例子在kibana里算是比较复杂的了。 

下面的例子实现了,aggs的一分钟数据的平均值计算。

{
  "query": {
    "filtered": {
      "query": {
        "query_string": {
          "query": "source:spider",
          "analyze_wildcard": true
        }
      },
      "filter": {
        "bool": {
          "must": [
            {
              "range": {
                "@timestamp": {
                  "gte": 1442502537890,
                  "lte": 1442503437890
                }
              }
            }
          ],
          "must_not": []
        }
      }
    }
  },
  "size": 0,
  "aggs": {
    "2": {
      "date_histogram": {
        "field": "@timestamp",
        "interval": "1m",
        "pre_zone": "+08:00",
        "pre_zone_adjust_large_interval": true,
        "min_doc_count": 1,
        "extended_bounds": {
          "min": 1442502537890,
          "max": 1442503437890
        }
      },
      "aggs": {
        "3": {
          "filters": {
            "filters": {
              "httpcode:200": {
                "query": {
                  "query_string": {
                    "query": "httpcode:200",
                    "analyze_wildcard": true
                  }
                }
              },
              "httpcode:304": {
                "query": {
                  "query_string": {
                    "query": "httpcode:304",
                    "analyze_wildcard": true
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

上面的那个例子是来自kibana的request,在给大家看看一个比较实用的aggs查询。

{
    "size": 0,
    "aggs": {
        "2": {
            "date_histogram": {
                "field": "idate",
                "interval": "1h",
                "pre_zone": "+08:00",
                "pre_zone_adjust_large_interval": true,
                "min_doc_count": 0
            }
        }
    },
    "query": {
        "filtered": {
            "query": {
                "regexp": {
                    "url": "sina.com.cn.*"
                }
            },
            "filter": {
                "bool": {
                    "should": [],
                    "must_not": [],
                    "must": [
                        {
                            "term": {
                                "keyword": "宝马"
                            }
                        },
                        {
                            "range": {
                                "idate": {
                                    "gte": "2015-08-01T00:00:00",
                                    "lte": "2015-08-20T00:00:00"
                                }
                            }
                        }
                    ]
                }
            }
        }
    }
}

这是返回结果,可以看到他是按照每个小时聚合的。

{
    "took": xx,
    "timed_out": false,
    "_shards": {
        "total": xx,
        "successful": xx,
        "failed": 0
    },
    "hits": {
        "total": xx,
        "max_score": 0,
        "hits": []
    },
    "aggregations": {
        "2": {
            "buckets": [
                {
                    "key_as_string": "2015-08-01T00:00:00.000Z",
                    "key": 1438387200000,
                    "doc_count": 2
                },
                {
                    "key_as_string": "2015-08-01T01:00:00.000Z",
                    "key": 1438390800000,
                    "doc_count": 11
                },
                {
                    "key_as_string": "2015-08-01T02:00:00.000Z",
                    "key": 1438394400000,
                    "doc_count": 4
                },
 .... ....

另外,python 调用elasticsearch是有些慢的,当然相对mysql来说是快了不少。 我这里也想到了如何解决elasticsearch查询速度。 不用elasticsearch的python模块,而是用gevent request来提交任务。这样算是隐形的解决了多任务下elasticsearch查询慢的问题。 


大家觉得文章对你有些作用! 如果想赏钱,可以用微信扫描下面的二维码,感谢!
另外再次标注博客原地址  xiaorui.cc

1 Response

发表评论

电子邮件地址不会被公开。 必填项已用*标注