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 相关文章推荐
对numpy中array和asarray的区别详解
Apr 17 Python
Python Requests模拟登录实现图书馆座位自动预约
Apr 27 Python
对python中Matplotlib的坐标轴的坐标区间的设定实例讲解
May 25 Python
python 读取Linux服务器上的文件方法
Dec 27 Python
Ubuntu下Anaconda和Pycharm配置方法详解
Jun 14 Python
解决py2exe打包后,总是多显示一个DOS黑色窗口的问题
Jun 21 Python
Python使用turtle库绘制小猪佩奇(实例代码)
Jan 16 Python
python 实现线程之间的通信示例
Feb 14 Python
python 成功引入包但无法正常调用的解决
Mar 09 Python
Python3自动生成MySQL数据字典的markdown文本的实现
May 07 Python
浅谈keras中的keras.utils.to_categorical用法
Jul 02 Python
关于Python3的import问题(pycharm可以运行命令行import错误)
Nov 18 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中通过HTTP_USER_AGENT判断是否为手机移动终端的函数代码
2013/02/14 PHP
自编函数解决pathinfo()函数处理中文问题
2014/11/03 PHP
简单了解WordPress开发中update_option()函数的用法
2016/01/11 PHP
Symfony2实现在doctrine中内置数据的方法
2016/02/05 PHP
PHP正则表达式函数preg_replace用法实例分析
2020/06/04 PHP
求解开jscript.encode代码的asp函数
2007/02/28 Javascript
不能再简单的无闪刷新验证码原理很简单
2007/11/05 Javascript
js同时按下两个方向键
2007/12/01 Javascript
JS this作用域以及GET传输值过长的问题解决方法
2013/08/06 Javascript
JS检测图片大小的实例
2013/08/21 Javascript
jquery实现省市select下拉框的替换(示例代码)
2014/02/22 Javascript
JavaScript实现数组在指定位置插入若干元素的方法
2015/04/06 Javascript
JQuery中属性过滤选择器用法实例分析
2015/05/18 Javascript
比例尺、缩略图、平移缩放之百度地图添加控件方法
2015/08/03 Javascript
浅谈js中test()函数在正则中的使用
2016/08/19 Javascript
JS实现图文并茂的tab选项卡效果示例【附demo源码下载】
2016/09/21 Javascript
JavaScript 通过Ajax 动态加载CheckBox复选框
2017/08/31 Javascript
默认浏览器设置及vue自动打开页面的方法
2018/09/21 Javascript
使用koa2创建web项目的方法步骤
2019/03/12 Javascript
layui清除radio的选中状态实例
2019/11/14 Javascript
Python 分析Nginx访问日志并保存到MySQL数据库实例
2014/03/13 Python
Python 实现自动导入缺失的库
2019/10/29 Python
使用django和vue进行数据交互的方法步骤
2019/11/11 Python
如何在mac版pycharm选择python版本
2020/07/21 Python
pytorch Dataset,DataLoader产生自定义的训练数据案例
2021/03/03 Python
意大利奢华内衣制造商:Cosabella
2017/08/29 全球购物
什么是smarty? Smarty的优点是什么?
2013/08/11 面试题
医学生自荐信范文
2013/12/03 职场文书
2014年大学生党课心得体会范文
2014/03/29 职场文书
幼儿园小班教师寄语
2014/04/03 职场文书
行政管理专业求职信
2014/07/06 职场文书
《悲惨世界》:比天空更广阔的是人的心灵
2020/01/16 职场文书
golang 比较浮点数的大小方式
2021/05/02 Golang
分析SQL窗口函数之取值窗口函数
2022/04/21 Oracle
阿里云服务器Ubuntu 20.04上安装Odoo 15
2022/05/20 Servers
win10滚动条自动往上跑怎么办?win10滚动条自动往上跑的解决方法
2022/08/05 数码科技