Python读写ElasticSearch【自用】

如何使用python访问Elasticsearch并实现大批量查询 问题背景: 近期的工作中,获取应用日志数据时,发现采用的是elk架构的日志服务器,需要访问ElasticSearch服务器来查询所需要的日志数据 自己也是第一次接触elk,因此走了不少的弯路,主要遇到的问题有: 1、Python如何连接es服务器——elasticsearch库 2、如何发送查询语句,获取查询结果——DSL查询语言 3、查询结果较多时,如何进行查询和保存——scroll方法 4、网络异常/查询失败时,如何自动重连——try+catch+while语法 在爆肝了几个晚上之后,总算把以上的全部问 阅读详情


基本调用

安装

conda insatll elasticsearch

基本调用

from elasticsearch import Elasticsearch

HOSTS = 'http://abc.com'
INDEX = 'abc'  # 索引(类似MySQL库名)

es = Elasticsearch(HOSTS)
js = es.search(INDEX, {'query': {'match_all': {}}})
print(js)
>>> from elasticsearch import Elasticsearch

# 默认连接localhost:9200
>>> es = Elasticsearch()

# 写
>>> es.index(index="my-index", doc_type="test-type", id=42, body={"any": "data"})
{'_id': '42', '_index': 'my-index', '_type': 'test-type', '_version': 1, 'ok': True}

# 读
>>> es.get(index="my-index", doc_type="test-type", id=42)['_source']
{'any': 'data'}

封装自用

from elasticsearch import Elasticsearch

HOSTS = 'http://abc.com'
INDEX = 'abc'  # 索引名(≈MySQL库名)
SIZE = 100
SCROLL = '5m'
DOC_TYPE = '_doc'
# SORT_KEY = '_id'  # 排序key名


class ES:
    def __init__(self, hosts=HOSTS):
        self.es = Elasticsearch(hosts)

    @staticmethod
    def yellow(x):
        print('\033[93m{}\033[0m'.format(x))

    def search(self, body=None, index=INDEX):
        return self.es.search(index, body or {'query': {'match_all': {}}})  # dict

    def scroll(self, body, index=INDEX, size=SIZE, return_ls=False):
        """分批取数"""
        js = self.es.search(index, body, scroll=SCROLL, size=size)
        scroll_id = js['_scroll_id']  # 卷动ID:用于取出剩余数据
        if return_ls:
            yield js['hits']['hits']  # 产出首批数据
            total = js['hits']['total']  # 结果总数
            for _ in range(total // SIZE):
                yield self.es.scroll(scroll_id=scroll_id, scroll=SCROLL)['hits']['hits']  # 产出剩余数据
        else:
            hits = js['hits']['hits']
            while hits:
                for i in hits:
                    yield i  # 从列表中取数
                hits = self.es.scroll(scroll_id=scroll_id, scroll=SCROLL)['hits']['hits']

    def index(self, body, index, i):
        """数据写入"""
        self.es.index(index, body, doc_type=DOC_TYPE, id=i)

    def delete(self, i, index):
        """按_id删除"""
        self.es.delete(index, i, doc_type=DOC_TYPE)

    def delete_by_query(self, body, index):
        """按查询语句删除"""
        self.es.delete_by_query(index, body)

    def exists(self, i, index):
        """根据_id判断数据是否存在"""
        return self.es.exists(index, i, doc_type=DOC_TYPE)

    def get_source(self, i, index, source=None):
        """根据_id精准查询数据内容(查不到将会报错)"""
        return self.es.get_source(index, i, _source=source) if source else self.es.get_source(index, i)

    def count(self, body, index, doc_type=DOC_TYPE):
        """条件统计"""
        return self.es.count(doc_type, index, body)

    def proportion_not_null(self, index, field=None):
        """非空统计"""
        a = self.count(index)['count']
        b = self.count(index, {'query': {'bool': {'must': {'exists': {'field': field}}}}})['count']
        print(field, a, b, b / a)

    def aggs_terms(self, index, field, size=15):
        """单字段统计"""
        return self.search({
            'aggs': {
                'CUSTOM NAME': {
                    'terms': {
                        'field': field,
                        'size': size,  # 解决aggs显示不全
                    }
                }
            }
        }, index)['aggregations']['CUSTOM NAME']['buckets']


es = ES()
scroll = es.scroll


if __name__ == '__main__':
    print(es.search({
        # '_source': ["dataType"],
        'size': 5,  # 10000最大?
        'query': {'range': {'id': {'gt': '616000000000000000'}}}
    })

print

{
	'took': 614,
	'timed_out': False,
	'_shards': {
		'total': 1,
		'successful': 1,
		'skipped': 0,
		'failed': 0
	},
	'hits': {
		'total': {
			'value': 10000,
			'relation': 'gte'
		},
		'max_score': 1.0,
		'hits': [{
			'_index': 'abc',  # 类似MySQL的库
			'_type': '_doc',  # 类似MySQL库中的表
			'_id': '9948942229923430',  # 类似MySQL表中的主键
			'_score': 1.0,
			'_source': {
				'title': '森林公园林地资源',
			}
		}, {
			'_index': 'abc',
			'_type': '_doc',
			'_id': '9948937613253017',
			'_score': 1.0,
			'_source': {
				'title': '小型微型企业创业创新示范基地',
			}
		}]
	}
}

ES基础

curl命令交互

cURL是一个利用URL语法在命令行下工作的文件传输工具(CommandLine Uniform Resource Locator)

curl -X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>'
被<>标记的部件解析
VERB合适的HTTP方法:GET、 POST、 PUT、 HEAD、DELETE…
PROTOCOL协议,如:http、https
HOSTElasticsearch 集群中任意节点的主机名,或者用localhost代表本地机节点
PORT端口号,默认9200
PATHAPI 的终端路径(如:_count将返回集群中文档数量)
可能含多个组件,如:_cluster/stats和_nodes/stats/jvm
QUERY_STRING任意可选的查询字符串参数 (常用?pretty使输出格式化成JSON)
BODY一个JSON格式的请求体

e.g.

curl -XGET 'http://localhost:9200/_count?pretty' -d '
{"query": {"match_all": {}}}
'

读写

写

PUT /megacorp/employee/1
{
    "full_name" : "小基基",
    "advantage": [ "数学", "物理" ]
}
节点示例解释
_indexmegacorp:索引名称类似MySQL的库
_typeemployee:类型名称类似MySQL的库中的表
_id1:特定雇员的ID类似MySQL的表中的主键

读

GET /megacorp/employee/1

常用查询语句

查询所有

{'query': {'match_all': {}}}

简单查询

{
    '_source': ['id'],
    'query': {'match': {'full_name': '老婆'}},
}

非空

{'query': {'bool': {'must': {'exists': {'field': field}}}}}  # 存在
{'query': {'bool': {'must_not': {'exists': {'field': field}}}}}  # 非存在

分页+排序

{
    'from': 20,
    'size': 10,
    'query': {'match': {'full_name': '老婆'}},
    'sort': {'_id': {'order': 'asc'}}
}

范围查询

{
    'query': {
        'range': {
            'id': {
                'gte': '615000000000000000',  # 大于等于
                'lt': '616000000000000000',  # 小于
            },
        }
    },
}

多条件查询(bool)

must
返回的文档必须满足must子句的条件,并且参与计分
filter
返回的文档必须满足filter子句的条件,但不像must那样参与计分
should
返回的文档可能满足should子句的条件。
在一个Bool查询中,如果没 must或 filter,有一个或者多个 should子句,那么只要满足一个就可以返回。 minimum_should_match参数定义了至少满足多少个子句
must_not
返回的文档必须不满足must_not定义的条件
{
    'query': {
        'bool': {
            'must': [
                {
                    'match': {
                        'valid': 'Y'
                    }
                }, {
                    'range': {
                        'id': {
                            'gte': '615000000000000000',
                            'lt': '616000000000000000',
                        }
                    }
                }
            ]
        }
    },
}

聚合

terms
{
    'aggs': {
        'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa': {
            'terms': {
                'field': 'year',  # 按年份聚合统计
                'size': 20,  # 解决aggs显示不全
            }
        }
    }
}

其它

from corpora.elastic_search import es

# 匹配+短语
match_phrase = {
    '_source': ['title'],
    'size': 20,
    'query': {
        'bool': {
            'must': [
                {
                    'match': {
                        'valid': 'Y'
                    }
                }, {
                    'match_phrase': {
                        'title': '复工'
                    }
                },
            ]
        }
    },
    'sort': {'_id': {'order': 'asc'}}
}


# 匹配+正则
match_regexp = {
    '_source': ['title'],
    # 'size': 20,
    'query': {
        'bool': {
            'must': [
                {
                    'match': {
                        'valid': 'Y'
                    }
                }, {
                    'regexp': {
                        'title': '申报|申请|专项资金|扶持',
                    }
                },
            ]
        }
    },
    'sort': {'_id': {'order': 'asc'}}
}

for i in scroll(_body):
    print(i['_source'])

appendix

参考:https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html

python 操作 Elasticsearch(一) python 操作 Elasticsearch(一) 1、python连接elasticsearch数据库 from elasticsearch import Elasticsearch from elasticsearch import helpers es = Elasticsearch(['你的elasticsearch的外网连接'], http_auth=('数据的用户名', '密码')) 阅读详情

相关推荐

使用Redis作为缓存优化ElasticSearch读写性能

在现代数据密集型应用中,ElasticSearch凭借其强大的全文搜索能力成为许多系统的首选搜索引擎。然而,随着数据量和查询量的增长,ElasticSearch的读写性能可能会成为瓶颈。本文将详细介绍如何使用Redis作为缓存层来显著提升ElasticSearch的读写性能,包括完整的架构设计、详细实现、Python代码示例和性能测试结果。

weixin_30777913的博客 1883

python操作elasticsearch

一、基本查询 from elasticsearch import Elasticsearch # 建立连接 es = Elasticsearch( hosts={'192.168.0.120', '192.168.0.153'}, # 地址 timeout=3600 # 超时时间 ) es.search(index='pv23') # index:选择数据库 此方法是默认查询,由于没有任何筛选条件,会默认显示前10条数据的所有信息 二、filter_path 添加过滤路径。通过

python学习者的博客 1万+

python 批量写入es

1环境 pyhont2.7 elasticsearch 5.6.8 es客户端。6.4.0 https://pypi.org/simple/elasticsearch/可查询可安装的es客户端包 pip install elasticsearch 是安装的最新包。。后面运行会报错。。不兼容。。。只能指定版本安装 pip install elasticserach==6.4.0 2脚本 import time from elasticsearch import Elasticse...

FUCK——GUN的博客 139

使用python库elasticsearch操作es

1、单个写入 from elasticsearch import Elasticsearch es = Elasticsearch("192.168.0.11:9200") mappings = { "id": "11", "serial": "版本", "tags": {"comment": "标签3"}, "status": "tag1" } es.index(index="index-te

buside的博客 2095

python 读写ini文件

今天给大家介绍一下,用python怎么快速读写ini配置文件 二、写文件 代码如下(示例): 三、封装成函数 注意: 如果某个section已经存在了,在写入的时候不能够再使用config.add_section(‘Title1’)这个函数了,这样会报错,所以,我们需要进行判断,先判断Title1是否存在,然后再进行操作 例子: 这样就可以再name_password 这个section下面进行追加操作了...

qq_33095999的博客 1万+

ENVI与Sarscape协同处理哨兵一号数据的完整流程解析

本文详细解析了利用ENVI与Sarscape软件协同处理哨兵一号(Sentinel-1)SAR数据的完整工作流程。从环境搭建、数据导入与裁剪,到核心的DEM辅助多时相配准、斑点噪声滤波,再到最终的地理编码与辐射定标,提供了标准化的操作指南与实用技巧,帮助用户高效地将原始雷达数据转化为可用于分析的地理编码产品。

weixin_29251131的博客 339

python读写elasticsearch

【代码】python读写elasticsearch。

weixin_51133173的博客 976

2026年信创系统技术应用专业人才培养基地建设方案(高职、信创新专业、人才培养、专业代码:510221)

响应国家信创产业战略及教育部新增“信创系统技术应用”专业(代码510221)的部署,联合麒麟软件、华为鸿蒙等领军企业,建设高水平信创人才培养基地。方案基于国家政策导向(如2027年央企全面国产化替代目标)和行业人才缺口(2025年缺口超80万人),提出以“产教融合、创新驱动”为核心,构建集教学、实训、认证于一体的综合性培养体系。 建设内容涵盖五大方向: 专业规划:分三阶段(2025-2030年)推进专业申报、课程开发与区域辐射,最终建成区域性信创技术创新平台。 课程体系:围绕运维、云计算、数据库、适配

啊碧根果的博客 1601

python操作es数据

不知不觉进入职场已经大半年了,有些收获,同时又感觉自己的渺小,感觉自己还需要学习很多。最近项目中需要利用Python读写es数据,试了网上的一些方法,有的方法已经过期了,有的报错,花了一段时间才成功搞定。现在将这些方法记录下来,方便自己也方便其它读者。 1)首先安装相应es的包; pip install elasticsearch 2)读取ES数据; from elasticsearch impo...

a18852867035的博客 8045

计算机保研/考研面试题——计算机组成原理篇

本文总结了985和华五学校习计算机保研/考研常问面试时的计算机组成原理题,欢迎点赞、收藏、评论、关注

安晴晚风的博客 7548

一文搞懂蚁群算法Ant Colony Optimization(ACO)!!!(灵感起源+数学原理+代码实现+实战应用)

本文系统介绍了蚁群算法的原理与实现。首先从蚂蚁觅食行为出发,阐释了信息素正反馈机制如何引导群体找到最短路径。随后详细解析了算法的数学模型,包括状态转移规则和信息素更新机制。通过MATLAB代码演示了算法在旅行商问题(TSP)中的应用,展示了路径构建和优化的完整流程。最后讨论了算法的优势、局限性和实际应用场景。蚁群算法通过模拟生物智能,为解决复杂优化问题提供了一种高效方法,其核心在于信息素的正反馈机制与随机探索的平衡。

qq_42212808的博客 888

Python 和 Elasticsearch 构建简易搜索

Python 和 Elasticsearch 构建简易搜索 作者:白宁超 2019年5月24日17:22:41 导读:件开发最大的麻烦事之一就是环境配置,操作系统设置,各种库和组件的安装。只有它们都正确,软件才能运行。如果从一种操作系统里面运行另一种操作系统,通常我们采取的策略就是引入虚拟机,比如在 Windows 系统里面运行 Linux 系统。这种方式有个很大的缺点就是资源占用多...

weixin_30719711的博客 312

手把手教你完成基于matlab的路面裂缝检测系统设计

裂缝是路面病害最早的形态之一,只有在裂缝出现的早期进行维护,才能有效地提高公路的使用寿命。因此,路面裂缝的检测识别系统对于提升公路质量有着重大的意义。首先,对路面裂缝图像进行相应的预处理,目的是减小环境因素的影响,消除无用的噪点。然后提取目标图像特征,判断路面裂缝类型,标记出路面裂缝的位置。最后通过设计的 GUI 界面来集成各个关键步骤,显示所得到的试验结果。仿真结果表明,设计的路面裂缝检测识别系统是高效可行的。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1216

如何实现用django读写elasticsearch

django读写elasticsearch,其实很简单

小桥流水 的专栏 1056

CDD数据库文件制作(十一)——服务配置(0x19_DTC Code)

虽然选择Copy和Reference都可以加载DTC,但是如果我们在DTC库中有修改DTC,通过Copy的方式加载的DTC在DTC Table中不会跟着DTC库的修改而自动更新。通过Reference的方式加载的DTC可以自动更新。找到Fault Memory的DTC Table,鼠标放在DTC Table区域,右键点击选择Copy …根据需要(客户协议)勾选响应的19服务子功能。如何创建一个新的DTC code?按照字母与下方要素可做一一对应。首先在DTC库中新建DTC。支持10 01/10 03。

LOVE135149的博客 1920

电气论文实现:前推回代在IEEE33节点中的潮流计算实现(matlab,python)

本文首先介绍了前推回代的原理。然后基于IEEE33节点算例,分别用python和matlab运用前推回代进行了潮流计算。

总裁余(余登武)博客 8610

python对csv文件的读写

首先先简单说一下csv文件,csv的全称是Comma-Separated Values,意思是逗号分隔值,通俗点说就是一组用逗号分隔的数据。CSV文件可以用excel打开,会显示如下图所示: 这个文件用notepad打开显示是这样的,这是它原始的样子: 好了,下班我们来用python对csv文件进行读写操作 1.读文件 如何用Python像操作Excel一样提取其中的一列,即一个字段,利用Py...

qq_30653631的博客 4万+

泰凌微8258入门教程——导读

基于泰凌微TLSR8258 Bluetooth® SIG Mesh 的入门系列教程

2万+

python 读取Elasticsearch数据

elasticsearch 库 pip installelasticsearch from elasticsearch import Elasticsearch ES_CONF = { "host": "192.168.11.22", "port": 9200, "user": "elastic", "passwd": "1234" } index = "test_index" def process_func(): # 从ES读取数据 es .

u011412768的博客 6179

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Python读写Excel文件

python 读写Excel文件(.xls .xlsx)

weixin_43641920的博客 4万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【用户画像(二)】Python操作ES(支持sql)及ES整合

就是在Python中通过SparkSession对象读取ElasticSearch中的内容, 然后将数据转为DataFrame.进行数据的操作.整合Hive是什么意思?(想想两个数据库之间能干什么,不就是导来导去) 其实就是将Hive中的表数据导入到ElasticSearch中。但是局限于原生的ElasticSearch的命令基本都是Restful风格的代码, 学习的难度未免会有所增加.创建表后,直接在使用es插件查询ES中的表是查询不到的.(需要往表中插入数据才能在ES中看到索引[表]的出现)

weixin_46244703的博客 1314

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Python——Python读写Elasticsearch、HBase、Hive

文章目录1. Elasticsearch2. HBase3. Hive 1. Elasticsearch 安装Elasticsearch模块: pip3 install elasticsearch==7.1.0 读取ES索引的代码实现: from elasticsearch import Elasticsearch es = Elasticsearch(hosts=[{"host": "host", "port": 9200}]) result = es.search(index="index_name

aof 340

python数据读写

python文件读写操作

SQL__Learning的博客 1135

python读写Excel表格

python读写Excel表格 python读写Excel表格其实就依赖两个库: python读excel——xlrd python写excel——xlwt 一. python读excel 1.先安装读表所需要的库 pip install xlrd 2.导入库,打开表格 improt xlrd #打开文件 table = xlrd.open_workbook("角色表.xlsx",'rb') 3.找到指定工作簿 ​ python获取工作簿方式: #方法一:通过索引 sheet = table.she

呵呵到天亮的博客 2425

Python随笔:对 txt 文件进行读写,清除,删除操作

Python随笔:对 txt 文件进行读写,清除内容,删除操作 文章目录Python随笔:对 txt 文件进行读写,清除内容,删除操作1.文件读写1.1 读写文件前打开文件的两个方法1.2 写入文件内容1.3 文件读取操作2. 清除文件内容3. 删除文件3. 删除文件 1.文件读写 1.1 读写文件前打开文件的两个方法 第一种**(推荐)**:通过 with open( ) as f: 来打开文件 这种方法会自动关闭文件。不用通过f.close()来关闭文件了。 第二种:通过f = open( )来打开

集电极 5万+
上一篇: Python时间戳的起点
下一篇: Python常用脚本头(复制自用)
小基基o_O
博客等级 码龄9年 4414粉丝 467原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小基基o_O

您的鼓励是我创作的巨大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值