您的位置:首页 > 编程语言 > Python开发

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

2017-08-22 01:01 621 查看

Python Elasticsearch api

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

安装API

[python] view plaincopy

pip install elasticsearch

建立es连接

[python] view plaincopy

from elasticsearch import Elasticsearch

es = Elasticsearch([{'host':'10.10.13.12','port':9200}])

  

数据检索功能

[python] view plaincopy

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

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}

  

知识扩展

滚动demo

[python] view plaincopy

# 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开始滚动之后的数据。

Query DSL

range过滤器查询范围

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

[python] view plaincopy

"range":{

"money":{

"gt":20,

"lt":40

}

}

  

bool组合过滤器

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

[python] view plaincopy

{

"bool":{

  "must":[],

  "should":[],

  "must_not":[],

}

}

term过滤器

term单过滤

[python] view plaincopy

{

"terms":{

  "money":20

}

}

  

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

[python] view plaincopy

{

"terms":{

  "money": [20,30]

}

}

正则查询

[python] view plaincopy

{

"regexp": {

"http_status_code": "5.*"

}

}

match查询

match 精确匹配

[python] view plaincopy

{

"match":{

  "email":"123456@qq.com"

}

}

multi_match 多字段搜索

[python] view plaincopy

{

"multi_match":{

  "query":"11",

  "fields":["Tr","Tq"]

}

}

demo

获取最近一小时的数据

[python] view plaincopy

{'query':

{'filtered':

{'filter':

{'range':

{'@timestamp':{'gt':'now-1h'}}

}

}

}

}

  

条件过滤查询

[python] view plaincopy

{

"query":{

"filtered":{

"query":{"match":{"http_status_code":500}},

"filter":{"term":{"server_name":"vip03"}}

}

}

}

Terms Facet 单字段统计

[python] view plaincopy

{'facets':

{'stat':

{'terms':

{'field':'http_status_code',

'order':'count',

'size':50}

}

},

'size':0

}

   

一次统计多个字段

[python] view plaincopy

{'facets':

{'cip':

{'terms':

{'fields':['client_ip']}},

'status_facets':{'terms':{'fields':['http_status_code'],

'order':'term',

'size':50}}},

'query':{'query_string':{'query':'*'}},

'size':0

}

  

多个字段一起统计

[python] view plaincopy

{'facets':

{'tag':

{'terms':

{'fields':['http_status_code','client_ip'],

'size':10

}

}

},

'query':

{'match_all':{}},

'size':0

}

  

数据组装

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

[python] view plaincopy

{

"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

}

  

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

[python] view plaincopy

{

"query": {

"query_string": {"query": "backend_name:baidu.com"}

}

},
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: