Python 操作 Elasticsearch 全指南:从连接到数据查询与处理
文章目录
- Python 操作 Elasticsearch 全指南:从连接到数据查询与处理
- 引言
- 安装 `elasticsearch-py`
- 连接到 Elasticsearch
- 创建索引
- 插入数据
- 查询数据
- 1. 简单查询
- 2. 布尔查询
- 更新文档
- 删除文档和索引
- 删除文档
- 删除索引
- 批量插入数据
- 处理分页结果
- 总结
Python 操作 Elasticsearch 全指南:从连接到数据查询与处理
引言
在大数据分析与搜索应用中,Elasticsearch 是一种强大且灵活的分布式搜索引擎,而 Python 则以其易用性和强大的数据处理能力,成为开发者在数据操作中的理想选择。通过 Python 的 elasticsearch-py
客户端,我们不仅可以方便地建立与 Elasticsearch 的连接,还能高效完成数据的增删改查操作,实现复杂的搜索与分析任务。本文将带你从基础配置到高级查询,全方位解析如何使用 elasticsearch-py
库操作 Elasticsearch。无论你是初学者还是资深开发者,本指南将提供实用的代码示例和最佳实践,帮助你在数据管理与搜索优化中脱颖而出。
安装 elasticsearch-py
首先,确保已安装 elasticsearch-py
,可通过以下命令安装:
pip install elasticsearch
安装完成后,库就可以在 Python 中使用了。
连接到 Elasticsearch
首先,我们需要在 Python 中建立到 Elasticsearch 的连接。以下代码展示了如何连接到本地的 Elasticsearch 服务器:
from elasticsearch import Elasticsearch# 连接到本地的 Elasticsearch 服务
es = Elasticsearch(hosts=["http://localhost:9200"])
# 检查连接是否成功
if es.ping():print("Connected to Elasticsearch")
else:print("Could not connect to Elasticsearch")
此代码连接到运行在 localhost
上的 Elasticsearch 服务,并通过 ping()
方法检查连接是否成功。
创建索引
在 Elasticsearch 中,数据存储在索引(index)中。创建索引的代码如下:
# 创建一个索引名为 "my_index" 的索引
index_name = "my_index"
if not es.indices.exists(index=index_name):es.indices.create(index=index_name)print(f"Index '{index_name}' created.")
else:print(f"Index '{index_name}' already exists.")
在这里,我们首先检查索引是否已存在,如果不存在,则创建新的索引。
插入数据
我们可以使用 index()
方法来插入数据。以下是将一些数据插入到 my_index
中的示例:
# 插入数据
doc = {"name": "John Doe","age": 30,"location": "New York"
}
res = es.index(index=index_name, document=doc)
print("Document indexed:", res["_id"])
这段代码将一条包含 name
、age
和 location
的记录插入到 my_index
索引中,并输出该记录的 _id
。
查询数据
Elasticsearch 提供了多种查询方式,可以根据需求进行简单查询或复合查询。以下示例演示如何使用 search()
方法进行查询:
1. 简单查询
以下代码展示了如何查找 location
为 “New York” 的文档:
# 简单查询
query = {"query": {"match": {"location": "New York"}}
}
res = es.search(index=index_name, body=query)
for hit in res["hits"]["hits"]:print(hit["_source"])
2. 布尔查询
以下是更复杂的布尔查询示例,查找 location
为 “New York” 并且 age
大于 25 的文档:
# 布尔查询
query = {"query": {"bool": {"must": [{"match": {"location": "New York"}},{"range": {"age": {"gt": 25}}}]}}
}
res = es.search(index=index_name, body=query)
for hit in res["hits"]["hits"]:print(hit["_source"])
更新文档
要更新已存在的文档,可以使用 update()
方法。以下示例将修改某条记录的 age
字段:
# 更新文档
doc_id = "文档的_id"
update_body = {"doc": {"age": 35}
}
res = es.update(index=index_name, id=doc_id, body=update_body)
print("Document updated:", res["_id"])
在这里,我们将指定文档的 age
更新为 35
。
删除文档和索引
我们可以删除不需要的数据和索引,以保持数据库整洁。
删除文档
# 删除文档
res = es.delete(index=index_name, id=doc_id)
print("Document deleted:", res["_id"])
删除索引
# 删除索引
es.indices.delete(index=index_name)
print(f"Index '{index_name}' deleted.")
批量插入数据
elasticsearch.helpers
模块提供了 bulk
方法,可以一次插入多条数据。以下是批量插入的示例:
from elasticsearch.helpers import bulk# 构建文档列表
docs = [{"_index": index_name, "_source": {"name": "Alice", "age": 25, "location": "London"}},{"_index": index_name, "_source": {"name": "Bob", "age": 27, "location": "Paris"}},{"_index": index_name, "_source": {"name": "Charlie", "age": 35, "location": "Berlin"}}
]# 批量插入
bulk(es, docs)
print("Bulk insertion completed.")
处理分页结果
如果查询返回大量数据,可以通过 from
和 size
参数进行分页。以下是分页的查询示例:
query = {"query": {"match_all": {}},"from": 0,"size": 2
}res = es.search(index=index_name, body=query)
for hit in res["hits"]["hits"]:print(hit["_source"])
这里指定 from: 0
和 size: 2
,即返回第一页的 2 条数据。
总结
本文介绍了在 Python 中使用 elasticsearch-py
连接到 Elasticsearch 的基本操作,包括连接、创建索引、插入数据、查询数据、更新和删除数据,以及批量操作。elasticsearch-py
使得 Python 程序可以方便地与 Elasticsearch 交互,适用于日志分析、数据挖掘等需要全文搜索的场景。
相关文章:
Python 操作 Elasticsearch 全指南:从连接到数据查询与处理
文章目录 Python 操作 Elasticsearch 全指南:从连接到数据查询与处理引言安装 elasticsearch-py连接到 Elasticsearch创建索引插入数据查询数据1. 简单查询2. 布尔查询 更新文档删除文档和索引删除文档删除索引 批量插入数据处理分页结果总结 Python 操作 Elasticse…...
Jarvis March算法详解及Python实现(附设计模式案例)
目录 Jarvis March算法详解及Python实现(附设计模式案例)第一部分:Jarvis March算法概述与原理1.1 什么是Jarvis March算法?1.2 算法原理1.3 算法流程1.4 时间复杂度第二部分:Jarvis March算法的Python实现(面向对象设计)2.1 面向对象设计2.2 代码实现2.3 代码解释第三部…...
AIGC中的文本风格迁移:基于深度学习的实现
引言 文本风格迁移是自然语言处理领域的一个重要研究方向,它可以将文本从一种风格转换为另一种风格,同时保留其原有的内容。随着深度学习技术的发展,文本风格迁移的方法变得越来越先进和高效。本文将探讨基于序列到序列模型(Seq2…...

丹摩征文活动 |【前端开发】HTML+CSS+JavaScript前端三剑客的基础知识体系了解
前言 🌟🌟本期讲解关于HTMLCSSJavaScript的基础知识,小编带领大家简单过一遍~~~ 🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-CSDN博客 🔥 你的点赞就是小编不断更新的最大动力 …...

响应“一机两用”政策 落实政务外网安全
在数字化时代,政务办公外网安全的重要性日益凸显,特别是在“一机两用”的背景下,即同一台终端既要处理政务内网的数据,又要访问互联网,这对网络安全提出了更高的要求。深信达SPN安全上网方案,即反向沙箱技术…...

通过JS删除当前域名中的全部COOKIE教程
有时候需要通过JS来控制一下网站的登录状态,就例如:网站登出功能,我们可以直接通过JS将所有COOKIE删除,COOKIE删除之后,网站自然也就退出了。 那么今天我就给大家分享一段JS的函数,通过调用这段函数就可以实现删除COO…...
Flutter:Widget生命周期
StatelessWidget:无状态部件的生命周期 import package:flutter/material.dart;void main() {runApp(App()); }class App extends StatelessWidget {overrideWidget build(BuildContext context) {return MaterialApp(home: MyHomePage(title: MyHome),);} }class M…...

Flutter:Dio下载文件到本地
import dart:io; import package:dio/dio.dart;main(){// 创建dio对象final dio Dio();// 下载地址var url https://*******.org/files/1.0.0.apk;// 手机端路径String savePath Directory.systemTemp.path/ceshi.apk;print(savePath);downLoad(dio,url,savePath); }downLo…...

[⑧5G NR]: PBCH payload生成
本篇博客记录下5G PBCH信道中payload数据的生成方式。PBCH payload一共32个比特,基本结构如下图: 根据SSB PDU中bchPayloadFlag的值有三种方式得到PBCH payload。 bchPayloadFlag 0:全部32比特由MAC层提供。 bchPayloadFlag 1:M…...
查看解决端口占用,以及docker解决端口占用的原理
在软件开发和部署过程中,端口占用是一个常见的问题。以下是查看和解决端口占用问题的完整解决方案: 一、查看端口占用情况 1. 在 Linux 系统中 方法一:使用 lsof 命令 sudo lsof -i:<端口号>输出信息中会显示占用端口的进程名称、PI…...

力扣-Hot100-链表其一【算法学习day.34】
前言 ###我做这类文档一个重要的目的还是给正在学习的大家提供方向(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非常非常高滴&am…...

centos7 升级openssl 与升级openssh 安装卸载 telnet-server
前言: 服务器被安全扫描,扫出了漏洞需要修复,根据提示将openssh升级为9.8p1的版本,同时需要升级openssl,但是升级openssh可能会导致ssh连接失败,从而无法继续操作,特别是远程机房尤为危险&#…...
C++知识点总结(57):STL综合
STL综合 一、数据结构1. 队列2. 映射 二、队列例题1. 约瑟夫环(数据加强)2. 打印队列3. 小组队列4. 日志统计 2.0 三、映射真题1. 眼红的 Medusa2. 美食评委 一、数据结构 1. 队列 功能代码定义queue<tp>q入队.push(x)出队.pop()队头.front()队尾…...

mac2019环境 Airflow+hive+spark+hadoop本地环境安装
1 环境介绍 本地安装可分为两个部分,mac软件环境, python开发环境 ps: 安装过程参考chatgpt、csdn文章 1.1 mac软件环境 目标安装的的软件是hive、apache-spark、hadoop,但是这三个软件又依赖java(spark依赖)、ssh(…...

如何使用EasyExcel生成多列表组合填充的复杂Excel示例
作者:Funky_oaNiu 一、(需求)生成的表格效果:二、搞一个模板文件三、建立对应的表格实体类四、开始填充五、Vue3前端发起请求下载六、官方文档及AI问答 一、(需求)生成的表格效果: 其中只有顶部…...

【MySQL】MySQL在Centos环境安装
🔥个人主页: Forcible Bug Maker 🔥专栏: MySQL 目录 🌈前言🔥卸载不要的环境🔥检查系统安装包🔥卸载这些默认安装包🔥获取mysql官方yum源🔥安装mysql yum源…...

JDBC-Mysql 时区问题详解
目录 一、前置准备 1.1 版本号列表 1.2 Sql脚本 1.3 application.yaml配置 1.4 数据库时区设置 二、java Date类型与(jdbcType)TIMESTAMP类型的转换 2.1 jdbc对serverTimeZone的处理 2.2 java Date转(jdbcType)TIMESTAMP …...

前端页面一些小点
案例一: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>快递单号查询</title><…...

Postman接口测试(断言、关联、参数化、输出测试报告)
基本界面展示 Get、Post请求 Postman断言 使用postman来判断预期结果与实际结果是否一致 响应状态码断言 响应包含字符串 断言判断字符串的格式 关联 用于解决http请求之间存在依赖关系 依赖:一个http请求的响应结果中的数据,被另一个请求使用 登…...
redis和mongodb等对比分析
Redis 和 MongoDB 都是非常流行的 NoSQL 数据库,它们在数据存储模型、性能、扩展性等方面有很大的差异。下面是 Redis 和 MongoDB 的对比分析: 1. 数据模型 Redis: 键值存储:Redis 是一个内存数据结构存储,它支持多种数据类型,如字符串、哈希、列表、集合、有序集合等。…...

SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...

C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...

回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
提升移动端网页调试效率:WebDebugX 与常见工具组合实践
在日常移动端开发中,网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时,开发者迫切需要一套高效、可靠且跨平台的调试方案。过去,我们或多或少使用过 Chrome DevTools、Remote Debug…...

【LeetCode】算法详解#6 ---除自身以外数组的乘积
1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...

第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10+pip3.10)
第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10pip3.10) 一:前言二:安装编译依赖二:安装Python3.10三:安装PIP3.10四:安装Paddlepaddle基础框架4.1…...