参考https://www.cnblogs.com/ghj1976/p/5293250.html也能够看个人印象笔记 term 过滤 term主要用于精确匹配哪些值,好比数字,日期,布尔值或 not_analyzed 的字符串(未经分析的文本数据类型): terms 过滤 terms 跟 term 有点相似,但 terms 容许指定多个匹配条件。 若是某个字段指定了多个值,那么文档须要一块儿去作匹配: { "terms": { "tag": [ "search", "full_text", "nosql" ] #tag字段对应的值有三种 } } exists 和 missing 过滤 exists 和 missing 过滤能够用于查找文档中是否包含指定字段或没有某个字段,相似于SQL语句中的IS_NULL条件. { "exists": { "field": "title" } } range 过滤 range过滤容许咱们按照指定范围查找一批数据: match 匹配查询 bool 查询 bool 查询与 bool 过滤类似,用于合并多个查询子句。不一样的是,bool 过滤能够直接给出是否匹配成功, 而bool 查询要计算每个查询子句的 _score (相关性分值)。 must:: 查询指定文档必定要被包含。 must_not:: 查询指定文档必定不要被包含。 should:: 查询指定文档,有则能够为文档相关性加分。 如下查询将会找到 title 字段中包含 "how to make millions",而且 "tag" 字段没有被标为 spam。 若是有标识为 "starred" 或者发布日期为2014年以前,那么这些匹配的文档将比同类网站等级高: { "bool": { "must": { "match": { "title": "how to make millions" }}, "must_not": { "match": { "tag": "spam" }}, "should": [ { "match": { "tag": "starred" }}, { "range": { "date": { "gte": "2014-01-01" }}} ] } }
#-*-coding:utf-8 import datetime from elasticsearch import Elasticsearch # 格式为:2016.7.19 的昨日日期 #yesterday = (datetime.datetime.now() + datetime.timedelta(days = -1)).strftime("%Y.%m.%d") # 格式为:2016-7-19 的昨日日期 #filter_yesterday = (datetime.datetime.now() + datetime.timedelta(days = -1)).strftime("%Y-%m-%d") # 格式为:2016.7.18 的前天日期 #before_yesterday = (datetime.datetime.now() + datetime.timedelta(days = -2)).strftime("%Y.%m.%d") # 请求elasticsearch节点的url url = "http://ip:9200/" # 使用的索引,因日期时区问题,因此要指定昨天和前天的索引名 #index_name = "deploy_metrics_pro-{date},deploy_metrics_pro-{b_date}".format(date=yesterday,b_date=before_yesterday) index_name = "deploy_metrics_pro" # 实例化Elasticsearch类,并设置超时间为120秒,默认是10秒的,若是数据量很大,时间设置更长一些 es = Elasticsearch(url,timeout=120) # DSL查询语法,在下面es.search使用 data = { "size": 10000000, #指定每一个分片最大返回的数据量,可根据日志量进行设置 "query" : { "bool":{ # 指定要匹配的字符,这里是查找全部数据 "must" : { "term":{'type':'deployment'} }, "filter":{ "range":{ "start_time_format":{ "gt": "2018-01-29 00:00:00", "lt": "2018-01-30 00:00:00" } }, }, #过滤,指定时间范围,这里设置成昨天0点到24点,代码上||-8h,由于ELK用的是UTC时间,跟北京时间偏差8小时,因此要减8小时,这就是日志里的北京时间了 #"filter" : { # "range" : { "@timestamp" : { # "gt" : "{date}T00:00:00||-8h".format(date=filter_yesterday), # "lt" : "{date}T23:59:59||-8h".format(date=filter_yesterday), # } # } #} } } } # 设置要过滤返回的字段值,要什么字段,就在这里添加,这样能够节约返回的数据量(带宽,内存等) return_fields = [ '_scroll_id', 'hits.hits._source.timestamp', 'hits.hits._source.@timestamp', 'hits.hits._source.project', 'hits.hits._source.username', 'hits.hits._source.start_time_format', ] def main(): # 指定search_type="scan"模式,并返回_scroll_id给es.scroll获取数据使用 res = es.search( index=index_name, body=data, search_type="scan", scroll="1m" ) scrollId=res["_scroll_id"] # 获取scrollID response= es.scroll(scroll_id=scrollId, scroll= "1m",filter_path=return_fields,) print response #print len(response['hits']['hits']) # 打印获取到的日志数量 # for hit in response['hits']['hits']: # print hit['_source'] if __name__ == "__main__": main()