http://blog.csdn.net/cnweike/article/details/33736429html
es教程:http://es.xiaoleilu.com/010_Intro/35_Tutorial_Aggregations.html
es python api:http://elasticsearch-py.readthedocs.io/en/latest/python
安裝APIweb
pip install elasticsearch
創建es鏈接api
from elasticsearch import Elasticsearch es = Elasticsearch([{'host':'10.10.13.12','port':9200}])
數據檢索功能緩存
es.search(index='logstash-2015.08.20', q='http_status_code:5* AND server_name:"web1"', from_='124119')
- took —— Elasticsearch執行這個搜索的耗時,以毫秒爲單位
- timed_out —— 指明這個搜索是否超時elasticsearch
- _shards —— 指出多少個分片被搜索了,同時也指出了成功/失敗的被搜索的shards的數量
- hits —— 搜索結果
- hits.total —— 可以匹配咱們查詢標準的文檔的總數目
- hits.hits —— 真正的搜索結果數據(默認只顯示前10個文檔).net
Elasticsearch中的全部的查詢都會觸發相關度得分的計算。對於那些咱們不須要相關度得分的場景下,Elasticsearch以過濾器的形式提供了另外一種查詢功能。過濾器在概念上相似於查詢,可是它們有很是快的執行速度,這種快的執行速度主要有如下兩個緣由
- 過濾器不會計算相關度的得分,因此它們在計算上更快一些
- 過濾器能夠被緩存到內存中,這使得在重複的搜索查詢上,其要比相應的查詢快出許多。
日誌
經常使用參數code
統計查詢功能server
# 語法同search大體同樣,但只輸出統計值
In[52]: es.count(index='logstash-2015.08.21', q='http_status_code:500') Out[52]:{u'_shards':{u'failed':0, u'successful':5, u'total':5}, u'count':17042}
知識擴展
# Initialize the scroll page = es.search( index ='yourIndex', doc_type ='yourType', scroll ='2m', search_type ='scan', size =1000, body ={ # Your query's body }) sid = page['_scroll_id'] scroll_size = page['hits']['total'] # Start scrolling while(scroll_size >0): print "Scrolling..." page = es.scroll(scroll_id = sid, scroll ='2m') # Update the scroll ID sid = page['_scroll_id'] # Get the number of results that we returned in the last scroll scroll_size = len(page['hits']['hits']) print "scroll size: "+ str(scroll_size) # Do something with the obtained page
以上demo實現了一次取若干數據,數據取完以後結束,不會獲取到最新更新的數據。咱們滾動完以後想獲取最新數據怎麼辦?滾動的時候會有一個統計值,如total: 5。跳出循環以後,咱們能夠用_from參數定位到5開始滾動以後的數據。
range過濾器查詢範圍
gt: > 大於
lt: < 小於
gte: >= 大於或等於
lte: <= 小於或等於
"range":{ "money":{ "gt":20, "lt":40 } }
bool組合過濾器
must:全部分句都必須匹配,與 AND 相同。
must_not:全部分句都必須不匹配,與 NOT 相同。
should:至少有一個分句匹配,與 OR 相同。
{ "bool":{ "must":[], "should":[], "must_not":[], } }
term過濾器
{ "terms":{ "money":20 } }
{ "terms":{ "money": [20,30] } }
match查詢
{ "match":{ "email":"123456@qq.com" } }
{ "multi_match":{ "query":"11", "fields":["Tr","Tq"] } }
demo
{'query': {'filtered': {'filter': {'range': {'@timestamp':{'gt':'now-1h'}} } } } }
{ "query":{ "filtered":{ "query":{"match":{"http_status_code":500}}, "filter":{"term":{"server_name":"vip03"}} } } }
{'facets': {'stat': {'terms': {'field':'http_status_code', 'order':'count', 'size':50} } }, 'size':0 }
{'facets': {'cip': {'terms': {'fields':['client_ip']}}, 'status_facets':{'terms':{'fields':['http_status_code'], 'order':'term', 'size':50}}}, 'query':{'query_string':{'query':'*'}}, 'size':0 }
{'facets': {'tag': {'terms': {'fields':['http_status_code','client_ip'], 'size':10 } } }, 'query': {'match_all':{}}, 'size':0 }
數據組裝
如下是kibana首頁的demo,用來統計一段時間內的日誌數量
{ "facets": { "0": { "date_histogram": { "field": "@timestamp", "interval": "5m" }, "facet_filter": { "fquery": { "query": { "filtered": { "query": { "query_string": { "query": "*" } }, "filter": { "bool": { "must": [ { "range": { "@timestamp": { 'gt': 'now-1h' } } }, { "exists": { "field": "http_status_code.raw" } }, # --------------- ------- # 此處加匹配條件 ] } } } } } } } }, "size": 0 }
若是想添加匹配條件,在以上代碼標識部分加上過濾條件,按照如下代碼格式便可
{ "query": { "query_string": {"query": "backend_name:baidu.com"} } },