zoukankan      html  css  js  c++  java
  • 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. },  
  • 相关阅读:
    python+selenium之中类/函数/模块的简单介绍和方法调用
    python之类
    Python+Selenium之断言对应的元素是否获取以及基础知识回顾
    Python+Selenium之摘取网页上全部邮箱
    C# 事件
    IConfigurationSectionHandler 接口
    ReaderWriterLockSlim 类
    log4net 按照日期备份日志
    Redis .net 客户端 分布式锁
    SQL Server Compact/SQLite Toolbox
  • 原文地址:https://www.cnblogs.com/timssd/p/7407469.html
Copyright © 2011-2022 走看看