Python对ElasticSearch获取数据及操作


Posted in Python onApril 24, 2019

使用Python对ElasticSearch获取数据及操作,供大家参考,具体内容如下

Version

Python :2.7

ElasticSearch:6.3

代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
  @Time  : 2018/7/4
  @Author : LiuXueWen
  @Site  : 
  @File  : ElasticSearchOperation.py
  @Software: PyCharm
  @Description: 对elasticsearch数据的操作,包括获取数据,发送数据
"""
import elasticsearch
import json

import Util_Ini_Operation

class elasticsearch_data():
  def __init__(self,hosts,username,password,maxsize,is_ssl):
    # 初始化ini操作脚本,获取配置文件
    try:
      # 判断请求方式是否ssl加密
      if is_ssl == "true":
        # 获取证书地址
        cert_pem = Util_Ini_Operation.get_ini("config.ini").get_key_value("certs","certs")
        es_ssl = elasticsearch.Elasticsearch(
          # 地址
          hosts=hosts,
          # 用户名密码
          http_auth=(username,password),
          # 开启ssl
          use_ssl=True,
          # 确认有加密证书
          verify_certs=True,
          # 对应的加密证书地址
          client_cert=cert_pem
        )
        self.es = es_ssl
      elif is_ssl == "false":
        # 创建普通类型的ES客户端
        es_ordinary = elasticsearch.Elasticsearch(hosts, http_auth=(username, password), maxsize=int(maxsize))
        self.es = es_ordinary
    except Exception as e:
      print(e)


  def query_data(self,keywords_list,date):
    gte = "now-"+str(date)
    query_data = {
      # 查询语句
      "query": {
        "bool": {
          "must": [
            {
              "query_string": {
                "query": keywords_list,
                "analyze_wildcard": True
              }
            },
            {
              "range": {
                "@timestamp": {
                  "gte": gte,
                  "lte": "now",
                  "format": "epoch_millis"
                }
              }
            }
          ],
          "must_not": []
        }
      }
    }
    return query_data

  # 从es获取数据
  def get_datas_by_query(self,index_name,keywords,param,date):
    '''
    :param index_name: 索引名称
    :param keywords: 关键字词,数组
    :param param: 需要数据条件,例如_source
    :param date: 过去时间范围,字符串格式,例如过去30分钟内数据,"30m"
    :return: all_datas 返回查询到的所有数据(已经过param过滤)
    '''

    all_datas = []
    # 遍历所有的查询条件
    for keywords_list in keywords:
      # DSL语句
      query_data = self.query_data(keywords_list,date)
      res = self.es.search(
        index=index_name,
        body=query_data
      )
      for hit in res['hits']['hits']:
        # 获取指定的内容
        response = hit[param]
        # 添加所有数据到数据集中
        all_datas.append(response)
    # 返回所有数据内容
    return all_datas

  # 当索引不存在创建索引
  def create_index(self,index_name):
    '''
    :param index_name: 索引名称
    :return:如果创建成功返回创建结果信息,试过已经存在创建新的index失败返回index的名称
    '''
    # 获取索引的映射
    # index_mapping = IndexMapping.index_mapping
    # # 判断索引是否存在
    # if self.es.indices.exists(index=index_name) is not True:
    #   # 创建索引
    #   res = self.es.indices.create(index=index_name,body=index_mapping)
    #   # 返回结果
    #   return res
    # else:
    #   # 返回索引名称
    #   return index_name
    pass

  # 插入指定的单条数据内容
  def insert_single_data(self,index_name,doc_type,data):
    '''
    :param index_name: 索引名称
    :param doc_type: 文档类型
    :param data: 需要插入的数据内容
    :return: 执行结果
    '''
    res = self.es.index(index=index_name,doc_type=doc_type,body=data)
    return res

  # 向ES中新增数据,批量插入
  def insert_datas(self,index_name):
    '''
    :desc 通过读取指定的文件内容获取需要插入的数据集
    :param index_name: 索引名称
    :return: 插入成功的数据条数
    '''
    insert_datas = []
    # 判断插入数据的索引是否存在
    self.createIndex(index_name=index_name)
    # 获取插入数据的文件地址
    data_file_path = self.ini.get_key_value("datafile","datafilepath")
    # 获取需要插入的数据集
    with open(data_file_path,"r+") as data_file:
      # 获取文件所有数据
      data_lines = data_file.readlines()
      for data_line in data_lines:
        # string to json
        data_line = json.loads(data_line)
        insert_datas.append(data_line)
    # 批量处理
    res = self.es.bulk(index=index_name,body=insert_datas,raise_on_error=True)
    return res

  # 从ES中在指定的索引中删除指定数据(根据id判断)
  def delete_data_by_id(self,index_name,doc_type,id):
    '''
    :param index_name: 索引名称
    :param index_type: 文档类型
    :param id: 唯一标识id
    :return: 删除结果信息
    '''
    res = self.es.delete(index=index_name,doc_type=doc_type,id=id)
    return res

  # 根据条件删除数据
  def delete_data_by_query(self,index_name,doc_type,param,gt_time,lt_time):
    '''
    :param index_name:索引名称,为空查询所有索引
    :param doc_type:文档类型,为空查询所有文档类型
    :param param:过滤条件值
    :param gt_time:时间范围,大于该时间
    :param lt_time:时间范围,小于该时间
    :return:执行条件删除后的结果信息
    '''
    # DSL语句
    query_data = {
      # 查询语句
      "query": {
        "bool": {
          "must": [
            {
              "query_string": {
                "query": param,
                "analyze_wildcard": True
              }
            },
            {
              "range": {
                "@timestamp": {
                  "gte": gt_time,
                  "lte": lt_time,
                  "format": "epoch_millis"
                }
              }
            }
          ],
          "must_not": []
        }
      }
    }
    res = self.es.delete_by_query(index=index_name,doc_type=doc_type,body=query_data,_source=True)
    return res

  # 指定index中删除指定时间段内的全部数据
  def delete_all_datas(self,index_name,doc_type,gt_time,lt_time):
    '''
    :param index_name:索引名称,为空查询所有索引
    :param doc_type:文档类型,为空查询所有文档类型
    :param gt_time:时间范围,大于该时间
    :param lt_time:时间范围,小于该时间
    :return:执行条件删除后的结果信息
    '''
    # DSL语句
    query_data = {
      # 查询语句
      "query": {
        "bool": {
          "must": [
            {
              "match_all": {}
            },
            {
              "range": {
                "@timestamp": {
                  "gte": gt_time,
                  "lte": lt_time,
                  "format": "epoch_millis"
                }
              }
            }
          ],
          "must_not": []
        }
      }
    }
    res = self.es.delete_by_query(index=index_name, doc_type=doc_type, body=query_data, _source=True)
    return res

  # 修改ES中指定的数据
  def update_data_by_id(self,index_name,doc_type,id,data):
    '''
    :param index_name: 索引名称
    :param doc_type: 文档类型,为空表示所有类型
    :param id: 文档唯一标识编号
    :param data: 更新的数据
    :return: 更新结果信息
    '''
    res = self.es.update(index=index_name,doc_type=doc_type,id=id,body=data)
    return res

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python collections模块实例讲解
Apr 07 Python
python动态网页批量爬取
Feb 14 Python
python+pyqt实现12306图片验证效果
Oct 25 Python
获取Django项目的全部url方法详解
Oct 26 Python
Python实现读取及写入csv文件的方法示例
Jan 12 Python
怎么使用pipenv管理你的python项目
Mar 12 Python
Python拆分大型CSV文件代码实例
Oct 07 Python
python进程间通信Queue工作过程详解
Nov 01 Python
Python使用configparser库读取配置文件
Feb 22 Python
解析Python 偏函数用法全方位实现
Jun 26 Python
Python使用tkinter实现小时钟效果
Feb 22 Python
python开发的自动化运维工具ansible详解
Aug 07 Python
Python3.5面向对象与继承图文实例详解
Apr 24 #Python
Python3.5基础之NumPy模块的使用图文与实例详解
Apr 24 #Python
基于python的ini配置文件操作工具类
Apr 24 #Python
python实现简单日期工具类
Apr 24 #Python
NumPy 基本切片和索引的具体使用方法
Apr 24 #Python
Python使用dict.fromkeys()快速生成一个字典示例
Apr 24 #Python
python3中property使用方法详解
Apr 23 #Python
You might like
php中获取远程客户端的真实ip地址的方法
2011/08/03 PHP
php禁止某ip或ip地址段访问的方法
2015/02/25 PHP
更正确的asp冒泡排序
2007/05/24 Javascript
javascript网页关闭时提醒效果脚本
2008/10/22 Javascript
javascript学习笔记(十六) 系统对话框(alert、confirm、prompt)
2012/06/20 Javascript
使用AngularJS 应用访问 Android 手机的图片库
2015/03/24 Javascript
如何使用jquery easyui创建标签组件
2015/11/18 Javascript
三个js循环的关键字示例(for与while)
2016/02/16 Javascript
js记录点击某个按钮的次数-刷新次数为初始状态的实例
2017/02/15 Javascript
Vue 过渡实现轮播图效果
2017/03/27 Javascript
mui上拉加载功能实例详解
2017/04/13 Javascript
详解webpack 配合babel 将es6转成es5 超简单实例
2017/05/02 Javascript
vue router学习之动态路由和嵌套路由详解
2017/09/21 Javascript
vue实现点击当前标签高亮效果【推荐】
2018/06/22 Javascript
Layui数据表格判断编辑输入的值,是否为我需要的类型详解
2019/10/26 Javascript
小程序采集录音并上传到后台
2019/11/22 Javascript
安装多版本Vue-CLI的实现方法
2020/03/24 Javascript
小程序中的箭头函数的具体使用
2020/06/19 Javascript
js实现贪吃蛇小游戏(加墙)
2020/07/31 Javascript
微信小程序换肤功能实现代码(思路详解)
2020/08/25 Javascript
Python简单计算文件MD5值的方法示例
2018/04/11 Python
Python面向对象之类和对象属性的增删改查操作示例
2018/12/14 Python
python Pexpect 实现输密码 scp 拷贝的方法
2019/01/03 Python
python实现各种插值法(数值分析)
2019/07/30 Python
Python pygame绘制文字制作滚动文字过程解析
2019/12/12 Python
python构造函数init实例方法解析
2020/01/19 Python
Python tkinter模版代码实例
2020/02/05 Python
Keras实现支持masking的Flatten层代码
2020/06/16 Python
python操作redis数据库的三种方法
2020/09/10 Python
python 线程的五个状态
2020/09/22 Python
HTML5的download属性详细介绍和使用实例
2014/04/23 HTML / CSS
西雅图电动自行车公司:Rad Power Bikes
2020/02/02 全球购物
仓库规划计划书
2014/04/28 职场文书
租车协议书范本2014
2014/11/17 职场文书
幼儿园小班班务总结
2015/08/03 职场文书
学校运动会感想
2015/08/10 职场文书