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发送以整个文件夹的内容为附件的邮件的教程
May 06 Python
Python将图片批量从png格式转换至WebP格式
Aug 22 Python
TensorFlow 滑动平均的示例代码
Jun 19 Python
Python实现的拉格朗日插值法示例
Jan 08 Python
解决Python 命令行执行脚本时,提示导入的包找不到的问题
Jan 19 Python
python ChainMap的使用和说明详解
Jun 11 Python
python中使用ctypes调用so传参设置遇到的问题及解决方法
Jun 19 Python
简单了解python的break、continue、pass
Jul 08 Python
Python PyQt5 Pycharm 环境搭建及配置详解(图文教程)
Jul 16 Python
python 字符串常用方法汇总详解
Sep 16 Python
python数据处理——对pandas进行数据变频或插值实例
Apr 22 Python
python 下载文件的多种方法汇总
Nov 17 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原理之变量(Variables inside PHP)
2013/08/09 PHP
PHP三元运算的2种写法代码实例
2014/05/12 PHP
php 替换文章中的图片路径,下载图片到本地服务器的方法
2018/02/06 PHP
ThinkPHP3.2.3框架实现的空模块、空控制器、空操作,跳转到错误404页面图文详解
2019/04/03 PHP
繁简字转换功能
2006/07/19 Javascript
走出JavaScript初学困境—js初学
2008/12/29 Javascript
JQuery中对服务器控件 DropdownList, RadioButtonList, CheckboxList的操作总结
2011/06/28 Javascript
JQuery中extend使用介绍
2014/03/13 Javascript
js检测网络是否具体连接功能的代码
2014/05/23 Javascript
js中一维数组和二位数组中的几个问题示例说明
2014/07/17 Javascript
JS小游戏之仙剑翻牌源码详解
2014/09/25 Javascript
详解js图片轮播效果实现原理
2015/12/17 Javascript
从重置input file标签中看jQuery的 .val() 和 .attr(“value”) 区别
2016/06/12 Javascript
基于JavaScript实现跳转提示页面
2016/09/24 Javascript
微信JS-SDK选取手机照片上传功能
2017/04/21 Javascript
JS去掉字符串前后空格、阻止表单提交的实现代码
2017/06/08 Javascript
详解React Native网络请求fetch简单封装
2017/08/10 Javascript
ES6/JavaScript使用技巧分享
2017/12/14 Javascript
Vue Socket.io源码解读
2018/02/07 Javascript
Vue一个案例引发的递归组件的使用详解
2018/11/15 Javascript
Vue商品控件与购物车联动效果的实例代码
2019/07/21 Javascript
解决在layer.open中使用时间控件laydate失败的问题
2019/09/11 Javascript
微信小程序 SOTER 生物认证DEMO 指纹识别功能
2019/12/13 Javascript
openlayers实现图标拖动获取坐标
2020/09/25 Javascript
vue中封装axios并实现api接口的统一管理
2020/12/25 Vue.js
[00:59]DOTA2背景故事第二期之四大基本法则
2020/07/07 DOTA
在Linux下调试Python代码的各种方法
2015/04/17 Python
python自动化测试之DDT数据驱动的实现代码
2019/07/23 Python
520使用Python实现“我爱你”表白
2020/05/20 Python
matplotlib教程——强大的python作图工具库
2020/10/15 Python
HTML5+CSS3 诱人的实例:3D立方体旋转动画实例
2016/12/30 HTML / CSS
谈谈对css属性box-sizing的了解
2017/01/04 HTML / CSS
中国最大隐形眼镜网上商城:视客眼镜网
2016/10/30 全球购物
年度考核自我鉴定
2014/03/19 职场文书
紧急通知
2015/04/17 职场文书
房产电话营销开场白
2015/05/29 职场文书