这两天和小朋友对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查询慢的问题。

谢谢博主,好久没看到这么好的贴了