Python Elasticsearch api

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

安装API


1

pip install elasticsearch

建立es连接


1

2

from elasticsearch import Elasticsearch

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

  

数据检索功能


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大致一样,但只输出统计值


1

2

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

# 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: <= 小于或等于


1

2

3

4

5

6

"range":{

    "money":{

        "gt":20,

        "lt":40

    }

}

  1.   

bool组合过滤器

must:所有分句都必须匹配,与 AND 相同。

must_not:所有分句都必须不匹配,与 NOT 相同。

should:至少有一个分句匹配,与 OR 相同。


1

2

3

4

5

6

7

{

    "bool":{

      "must":[],

      "should":[],

      "must_not":[],

    }

}

term过滤器

  • term单过滤

1

2

3

4

5

{

    "terms":{

      "money":20

    }

}

  

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

1

2

3

4

5

{

    "terms":{

      "money": [20,30]

    }

}

正则查询 


1

2

3

4

5

{

    "regexp": {

        "http_status_code""5.*"

    }

}

match查询

  • match 精确匹配

1

2

3

4

5

{

    "match":{

      "email":"[email protected]"

    }

}

  • multi_match 多字段搜索

1

2

3

4

5

6

{

    "multi_match":{

      "query":"11",

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

    }

}

demo

  • 获取最近一小时的数据

1

2

3

4

5

6

7

8

9

{‘query‘:

    {‘filtered‘:

        {‘filter‘:

            {‘range‘:

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

            }

        }

    }

}

  1.   
  • 条件过滤查询

1

2

3

4

5

6

7

8

{

    "query":{

        "filtered":{

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

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

        }

    }

}

  • Terms Facet 单字段统计

1

2

3

4

5

6

7

8

9

10

{‘facets‘:

    {‘stat‘:

        {‘terms‘:

            {‘field‘:‘http_status_code‘,

              ‘order‘:‘count‘,

        ‘size‘:50}

        }

    },

    ‘size‘:0

}

   

  • 一次统计多个字段

1

2

3

4

5

6

7

8

9

10

{‘facets‘:

    {‘cip‘:

        {‘terms‘:

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

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

              ‘order‘:‘term‘,

              ‘size‘:50}}},

        ‘query‘:{‘query_string‘:{‘query‘:‘*‘}},

    ‘size‘:0

}

  

  • 多个字段一起统计

1

2

3

4

5

6

7

8

9

10

11

12

{‘facets‘:

    {‘tag‘:

        {‘terms‘:

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

              ‘size‘:10

           }

        }

    },

    ‘query‘:

        {‘match_all‘:{}},

    ‘size‘:0

}

  

数据组装

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


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

{

  "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

}

  

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


1

2

3

4

5

{

"query": {

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

    }

},

  

先介绍到这里,后续会有Query DSL API介绍。

时间: 2024-10-22 20:10:55

Python Elasticsearch api的相关文章

Python Elasticsearch API操作ES集群

环境 Centos 7.4 Python 2.7 Pip 2.7 MySQL-python 1.2.5 Elasticsearc 6.3.1 Elasitcsearch6.3.2 知识点 调用Python Elasticsearh API Python Mysqldb使用 DSL查询与聚合 Pyehon 列表操作 代码 #!/usr/bin/env python # -*- coding: utf-8 -*- #minyt 2018.9.1 #获取24小时内出现的模块次数 # 该程序通过elas

Python DB API的异常

我们在昨天预告了一下Python DB API的异常,今天我们来细讲一下: 1.所有异常的超类:StandardError; 2.waring:属于StandardError超类,发生非致命问题所以发的异常: 3.Error:属于StandardError超类,所有错误条件的超类: 4.InterfaceError:属于Error超类,发生与接口(非数据库)相关的错误所引发的异常: 5.DatabaseError:属于Error超类,发生与数据库相关的错误的超类: 6.DataError:属于D

Python C API 引用计数器(三)

简介 Python的内存管理是通过对象的引用计数器来实现的,对象的创建会将引用计数器加1,被引用一次则引用计数器就会加1,反之解除引用时,则引用计数器就会减1,当Python对象的引用计数器为0的时候,则这个对象就会被回收和释放. 这种内存管理的方式是有一定的弊端的,一是它需要额外的空间维护引用计数,二是它不能解决对象的"循环引用"的问题,因此,也有很多语言比如Java并没有采用该算法做来垃圾的回收机制. Python代码实例 import sys def test_refcount(

Python DB API 连接数据库

Python DB API Mysql,Oracle,SqlServer 不关闭,会浪费资源. 原文地址:https://www.cnblogs.com/jiqing9006/p/9713716.html

如何用 Python 和 API 收集与分析网络数据?

摘自 https://www.jianshu.com/p/d52020f0c247 本文以一款阿里云市场历史天气查询产品为例,为你逐步介绍如何用 Python 调用 API 收集.分析与可视化数据.希望你举一反三,轻松应对今后的 API 数据收集与分析任务. 市场 我们尝试的,是他们找到的阿里云市场的一款 API 产品,提供天气数据. 它来自于易源数据,链接在 https://market.aliyun.com/products/57096001/cmapi010812.html?spm=517

python编写api接口

 目标: 使用Python实现一个简单的接口服务,可以通过get.post方法请求该接口,拿到响应数据.创建一个api_server.py文件, 想要实现的效果是这样的: 添加代码如下:  1 import flask,json 2 from flask import request 3 4 ''' 5 flask: seb框架,通过flask提供的装饰器@server.route()将普通函数转换为服务 6 登录接口,需要传入url,username,passwd 7 ''' 8 9 #创建一

Python Elasticsearch DSL 查询、过滤、聚合操作实例

github.com/yongxinz/te… Elasticsearch 基本概念 Index:Elasticsearch用来存储数据的逻辑区域,它类似于关系型数据库中的database 概念.一个index可以在一个或者多个shard上面,同时一个shard也可能会有多个replicas. Document:Elasticsearch里面存储的实体数据,类似于关系数据中一个table里面的一行数据. document由多个field组成,不同的document里面同名的field一定具有相同

python flask api

使用python的Flask实现一个RESTful API服务器端[翻译] 用python+flask自己制作api(教程附源码)

python RESTful API框架:Eve 快速入门

Eve是一款Python的REST API框架,用于发布高可定制的.全功能的RESTful的Web服务,帮你轻松创建和部署API,本文翻译自Eve官方网站: http://python-eve.org/quickstart.html#database-interlude Eve 快速入门: 渴望开始吗?这个页面将提供Eve一个很好的介绍.在这之前假设: 你已经安装好了Eve.如果你还没有,可以点击到安装页面. 已经安装了MongoDB. 并且MongoDB 已经运行了. 一个最小的应用 一个最小