这两天和小朋友对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查询慢的问题。
谢谢博主,好久没看到这么好的贴了