Python Elasticsearch api,组合过滤器,term过滤器,正则查询 ,match查询,获取最近一小时的数据

Python Elasticsearch api

 
描述:ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。下面介绍了利用Python API接口进行数据查询,方便其他系统的调用。


安装API

[python] view plaincopy
 
  1. pip install elasticsearch  



建立es连接

[python] view plaincopy
 
  1. from elasticsearch import Elasticsearch  
  2. es = Elasticsearch([{'host':'10.10.13.12','port':9200}])  


  

数据检索功能

[python] view plaincopy
 
  1. es.search(index='logstash-2015.08.20', q='http_status_code:5* AND server_name:"web1"', from_='124119')  




常用参数

index - 索引名

q - 查询指定匹配 使用Lucene查询语法

from_ - 查询起始点 默认0

doc_type - 文档类型

size - 指定查询条数 默认10

field - 指定字段 逗号分隔

sort - 排序 字段:asc/desc

body - 使用Query DSL

scroll - 滚动查询


统计查询功能
# 语法同search大致一样,但只输出统计值

[python] view plaincopy
 
  1. In[52]: es.count(index='logstash-2015.08.21', q='http_status_code:500')  
  2. Out[52]:{u'_shards':{u'failed':0, u'successful':5, u'total':5}, u'count':17042}  


  



知识扩展

滚动demo

[python] view plaincopy
 
  1. # Initialize the scroll  
  2. page = es.search(  
  3.     index ='yourIndex',  
  4.     doc_type ='yourType',  
  5.     scroll ='2m',  
  6.     search_type ='scan',  
  7.     size =1000,  
  8.     body ={  
  9.     # Your query's body  
  10. })  
  11.   
  12. sid = page['_scroll_id']  
  13. scroll_size = page['hits']['total']  
  14.   
  15. # Start scrolling  
  16. while(scroll_size >0):  
  17.     print "Scrolling..."  
  18.     page = es.scroll(scroll_id = sid, scroll ='2m')  
  19.     # Update the scroll ID  
  20.     sid = page['_scroll_id']  
  21.     # Get the number of results that we returned in the last scroll  
  22.     scroll_size = len(page['hits']['hits'])  
  23.     print "scroll size: "+ str(scroll_size)  
  24.     # Do something with the obtained page  



以上demo实现了一次取若干数据,数据取完之后结束,不会获取到最新更新的数据。我们滚动完之后想获取最新数据怎么办?滚动的时候会有一个统计值,如total: 5。跳出循环之后,我们可以用_from参数定位到5开始滚动之后的数据。



Query DSL


range过滤器查询范围

gt: > 大于
lt: < 小于
gte: >= 大于或等于
lte: <= 小于或等于

[python] view plaincopy
 
  1. "range":{  
  2.     "money":{  
  3.         "gt":20,  
  4.         "lt":40  
  5.     }  
  6. }  


  

bool组合过滤器

must:所有分句都必须匹配,与 AND 相同。
must_not:所有分句都必须不匹配,与 NOT 相同。
should:至少有一个分句匹配,与 OR 相同。

[python] view plaincopy
 
  1. {  
  2.     "bool":{  
  3.       "must":[],  
  4.       "should":[],  
  5.       "must_not":[],  
  6.     }  
  7. }  





term过滤器

term单过滤

[python] view plaincopy
 
  1. {  
  2.     "terms":{  
  3.       "money":20  
  4.     }  
  5. }  


  

terms复数版本,允许多个匹配条件

[python] view plaincopy
 
  1. {  
  2.     "terms":{  
  3.       "money": [20,30]  
  4.     }  
  5. }  





正则查询 

[python] view plaincopy
 
  1. {  
  2.     "regexp": {  
  3.         "http_status_code": "5.*"  
  4.     }  
  5. }  




match查询

match 精确匹配

[python] view plaincopy
 
  1. {  
  2.     "match":{  
  3.       "email":"123456@qq.com"  
  4.     }  
  5. }  




multi_match 多字段搜索

[python] view plaincopy
 
  1. {  
  2.     "multi_match":{  
  3.       "query":"11",  
  4.       "fields":["Tr","Tq"]  
  5.     }  
  6. }  




demo

获取最近一小时的数据

[python] view plaincopy
 
  1. {'query':  
  2.     {'filtered':  
  3.         {'filter':  
  4.             {'range':  
  5.                 {'@timestamp':{'gt':'now-1h'}}  
  6.             }  
  7.         }  
  8.     }  
  9. }  


  

条件过滤查询

[python] view plaincopy
 
  1. {  
  2.     "query":{  
  3.         "filtered":{  
  4.             "query":{"match":{"http_status_code":500}},  
  5.             "filter":{"term":{"server_name":"vip03"}}  
  6.         }  
  7.     }  
  8. }  




Terms Facet 单字段统计

[python] view plaincopy
 
  1. {'facets':  
  2.     {'stat':  
  3.         {'terms':  
  4.             {'field':'http_status_code',  
  5.               'order':'count',  
  6.         'size':50}  
  7.         }  
  8.     },  
  9.     'size':0  
  10. }  


   

一次统计多个字段

[python] view plaincopy
 
  1. {'facets':  
  2.     {'cip':  
  3.         {'terms':  
  4.             {'fields':['client_ip']}},  
  5.               'status_facets':{'terms':{'fields':['http_status_code'],  
  6.               'order':'term',  
  7.               'size':50}}},  
  8.         'query':{'query_string':{'query':'*'}},  
  9.     'size':0  
  10. }  


  

多个字段一起统计

[python] view plaincopy
 
  1. {'facets':  
  2.     {'tag':  
  3.         {'terms':  
  4.             {'fields':['http_status_code','client_ip'],  
  5.               'size':10  
  6.            }  
  7.         }  
  8.     },  
  9.     'query':  
  10.         {'match_all':{}},  
  11.     'size':0  
  12. }  


  


数据组装

以下是kibana首页的demo,用来统计一段时间内的日志数量

[python] view plaincopy
 
  1. {  
  2.   "facets": {  
  3.     "0": {  
  4.       "date_histogram": {  
  5.         "field": "@timestamp",  
  6.         "interval": "5m"  
  7.       },  
  8.       "facet_filter": {  
  9.         "fquery": {  
  10.           "query": {  
  11.             "filtered": {  
  12.               "query": {  
  13.                 "query_string": {  
  14.                   "query": "*"  
  15.                 }  
  16.               },  
  17.               "filter": {  
  18.                 "bool": {  
  19.                   "must": [  
  20.                     {  
  21.                       "range": {  
  22.                         "@timestamp": {  
  23.                           'gt': 'now-1h'  
  24.                         }  
  25.                       }  
  26.                     },  
  27.                     {  
  28.                       "exists": {  
  29.                         "field": "http_status_code.raw"  
  30.                       }  
  31.                     },  
  32.                     # --------------- -------  
  33.                     # 此处加匹配条件  
  34.                   ]  
  35.                 }  
  36.               }  
  37.             }  
  38.           }  
  39.         }  
  40.       }  
  41.     }  
  42.   },  
  43.   "size": 0  
  44. }  


  

如果想添加匹配条件,在以上代码标识部分加上过滤条件,按照以下代码格式即可

[python] view plaincopy
 
  1. {  
  2. "query": {  
  3.     "query_string": {"query": "backend_name:baidu.com"}  
  4.     }  
  5. },  
原文地址:https://www.cnblogs.com/timssd/p/7407469.html