python 讀取es數據

參考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()
相關文章
相關標籤/搜索