如何通過python+request查詢elasticsearch數(shù)據(jù)

? ? ? ? 前段時間數(shù)據(jù)出了些問題,需要去查一些用戶的相關操作日志,我們公司所有的日志都是存放在efk中,由于用戶數(shù)據(jù)很多,不可能每一條一條去查,所以就在想能不能通過http的方式通過python去查,并打印出來。于是用了http+request方式進行請求,發(fā)現(xiàn)數(shù)據(jù)返回不OK。所以就對elasticsearch中的 http請求進行分析,發(fā)現(xiàn)elasticsearch雖然是用http請求的,但是在頭部里面的格式是不一樣的,因為字段“content-type”用的不是普通的json,而是用的application/x-ndjson,然后發(fā)現(xiàn)參數(shù)中的負載有兩個字典,一個是index開頭的,而第二個字典才是真正的傳值參數(shù)。因為以前沒有遇到過這種參數(shù),所以用python在請求,不管怎么組裝這個參數(shù)都不能返回正確的數(shù)據(jù)回來。

elasticsearch正常請求

后面查了一下資料,關于elasticsearch如果要通過http去請求數(shù)據(jù)時,需要把參數(shù)的兩個字典重新組合,且在每個字典的后面一定要加上回車符號("\n")。具體的組合方法如下:

payload1= {"index": "tomcat-gateway-info-*", "ignore_unavailable": True, "preference": 1561910540186}

payload2= {"version": True, "size": 2000, "sort": [{"@timestamp": {"order": "desc", "unmapped_type": "boolean"}}],

? ? ? ? ? ? "_source": {"excludes": []}, "aggs": {"2": {

"date_histogram": {"field": "@timestamp", "interval": "3h", "time_zone": "Asia/Shanghai",

? ? ? ? ? ? ? ? ? ? ? ? ? "min_doc_count": 1}}}, "stored_fields": ["*"], "script_fields": {},

? ? ? ? ? ? "docvalue_fields": [{"field": "@timestamp", "format": "date_time"}], "query": {"bool": {

"must": [{"range": {"@timestamp": {"gte": 1561307158200, "lte": 1561911958200, "format": "epoch_millis"}}}],

? ? ? ? "filter": [{"multi_match": {"type": "best_fields", "query": trace_id, "lenient": True}}], "should": [],

? ? ? ? "must_not": []}},

? ? ? ? ? ? "highlight": {"pre_tags": ["@kibana-highlighted-field@"], "post_tags": ["@/kibana-highlighted-field@"],

? ? ? ? ? ? ? ? ? ? ? ? ? "fields": {"*": {}}, "fragment_size": 2147483647}, "timeout": "30000ms"}

data= json.dumps(payload1)+ "\n" + json.dumps(payload2)+ "\n"

以上代碼中payload1?和 payload2是兩個不同的字典,而data就是payload1 和payload2組合之后真正的參數(shù),那么請求時的參數(shù)就是data變量。

result= requests.post(url=url, data=data, headers=header)。

用這種方式向elasticsearch進行http請求之后,就能夠拿到正常的數(shù)據(jù)了。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容