#!/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对ElasticSearch获取数据及操作的更多相关文章

  1. DataReader方式 获取数据的操作

    一.使用DataReader读取为对象List /// <summary> /// 获得数据列表List<>,DataReader 使用参数的 /// </summary ...

  2. python连接 elasticsearch 查询数据,支持分页

    使用python连接es并执行最基本的查询 from elasticsearch import Elasticsearch es = Elasticsearch(["localhost:92 ...

  3. Python开发实战教程(8)-向网页提交获取数据

    来这里找志同道合的小伙伴!↑↑↑ Python应用现在如火如荼,应用范围很广.因其效率高开发迅速的优势,快速进入编程语言排行榜前几名.本系列文章致力于可以全面系统的介绍Python语言开发知识和相关知 ...

  4. echarts通过ajax动态获取数据的方法

    echarts表格的数据一般都需要动态获取,所以总结了一下通过ajax动态获取数据的操作: 插入的方法应该不止一种,我也是接触不久,所以刚学会了一种插入方法: 灵感和经验来自:https://www. ...

  5. python数据库操作常用功能使用详解(创建表/插入数据/获取数据)

    实例1.取得MYSQL版本 复制代码 代码如下: # -*- coding: UTF-8 -*-#安装MYSQL DB for pythonimport MySQLdb as mdbcon = Non ...

  6. python实现elasticsearch操作-CRUD API

    python操作elasticsearch常用API 目录 目录 python操作elasticsearch常用API1.基础2.常见增删改操作创建更新删除3.查询操作查询拓展类实现es的CRUD操作 ...

  7. Python Socket请求网站获取数据

     Python Socket请求网站获取数据 ---阻塞 I/O     ->收快递,快递如果不到,就干不了其他的活 ---非阻塞I/0 ->收快递,不断的去问,有没有送到,有没有送到,. ...

  8. Python+selenium之获取文本值和下拉框选择数据

    Python+selenium之获取文本值和下拉框选择数据 一.结合实例进行描述 1. 实例如下所示: #新增标签操作 def func_labels(self): self.driver.find_ ...

  9. 孤荷凌寒自学python第四十九天继续研究跨不同类型数据库的通用数据表操作函数

    孤荷凌寒自学python第四十九天继续研究跨不同类型数据库的通用数据表操作函数 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 今天继续建构自感觉用起来顺手些的自定义模块和类的代码. 不同类型 ...

随机推荐

  1. 第05组 Alpha冲刺(1/4)

    队名:天码行空 组长博客连接 作业博客连接 团队燃尽图(共享): GitHub当日代码/文档签入记录展示(共享): 组员情况: 组员1:卢欢(组长) 过去两天完成了哪些任务:SVN管理工具搭建 展示G ...

  2. WPF 精修篇 窗体唯一(Single) 显示在最前

    原文:WPF 精修篇 窗体唯一(Single) 显示在最前 只运行一个窗体 并在一次点击时 显示到最前 发现用 SetForegroundWindow 并不是稳定的有效 最后使用 SetWindowP ...

  3. Repair Microsoft.VisualStudio.MinShell.Msi.Resources 2203 error And visual studio 2019 key

    1. Go to the properties of "My computer" 2. Go to advanced settings of the system 3. Go to ...

  4. 发布Jar包到中央仓库

    参考流程 https://blog.csdn.net/qq_36838191/article/details/81027586 备份还原 gpg-keys https://blog.rathena.c ...

  5. python实现圣诞树

    先来个迷你的 *_* height = 5 stars = 1 for i in range(height): print((' ' * (height - i)) + ('*' * stars)) ...

  6. 【文本处理命令】之grep搜索命令详解

    一.grep搜索命令 在日常使用中grep命令也是会经常用到的一个搜索命令.grep命令用于在文本中执行关键词搜索,并显示匹配的结果. 格式: grep [选项] [文件] Usage: grep [ ...

  7. MySQL变量介绍和用法简介

    目录 一.用户变量 1.1.用户变量定义 1.2.用户变量用法 二.系统变量 2.1 系统变量简单介绍 2.2 系统变量用法简介 本博客介绍一下MySQL中变量的用法和注意细节 @ 一.用户变量 1. ...

  8. EJB组件开发实记(1)

    安装JBoss或者Wildfly jdk1.4以上. Eclipes安装插件 JBoss Tools: eclipes Jee photon 在eclipes 内部点击 >>Windows ...

  9. 利用Python进行数据分析-Pandas(第一部分)

    利用Python进行数据分析-Pandas: 在Pandas库中最重要的两个数据类型,分别是Series和DataFrame.如下的内容主要围绕这两个方面展开叙述! 在进行数据分析时,我们知道有两个基 ...

  10. Linux war包部署jenkins

    一.介绍Jenkins 1.Jenkins概念 Jenkins是一个功能强大的应用程序,允许持续集成和持续交付项目,无论用的是什么平台.这是一个免费的源代码,可以处理任何类型的构建或持续集成.集成Je ...