使用Elasticsearch Python SDK 查询Easysearch

news2024/11/13 13:24:46

随着数据分析需求的不断增长,能够高效地查询和分析大数据集变得越来越重要。Elasticsearch作为一种强大的分布式搜索和分析引擎,被广泛应用于各种场景。Easyearch 支持原生 Elasticsearch 的 DSL 查询语法,确保原业务代码无需调整即可无缝迁移。同时,EasySearch还支持 SQL 查询,为熟悉 SQL 的开发人员提供更加便捷的数据分析方式。此外,EasySearch 兼容 Elasticsearch 的 SDK 和现有索引存储格式,支持冷热架构和索引生命周期管理,确保用户能够轻松实现数据的无缝衔接。

Elasticsearch Python客户端提供了一种简便的方法,使得开发者可以通过DSL、SQL语法对Elasticsearch索引进行查询。同时,Elasticsearch Python客户端还提供了高级功能如批量操作API。本文将详细介绍如何安装和使用Elasticsearch Python客户端,以便在Python应用程序中对Elasticsearch执行DSL和SQL查询。

1. 安装 Elasticsearch Python 客户端

要使用Elasticsearch Python客户端,首先需要通过pip进行安装。打开终端或命令提示符,并运行以下命令:

pip install elasticsearch==7.13.1

如果使用默认版本安装,会安装8.x的依赖,可能会报错 elasticsearch.UnsupportedProductError: The client noticed that the server is not Elasticsearch and we do not support this unknown product.

由于Elasticsearch 7.10.2以后变更了许可模式,引入了 Server Side Public License (SSPL) 和 Elastic License,很多基于Elasticsearch 7.10.2分支出来的搜索引擎需要使用7.x版本的SDK和agent,比如Beats全家桶。

在这里插入图片描述
这是一个获取集群信息的demo,使用es.cluster.health() 调用 Elasticsearch 集群的健康检查API,返回集群的健康状态。

由于使用了自签名证书,所以在初始化时加上 verify_certs=False 参数,同时使用 warnings.filterwarnings("ignore") 设置 Python 的警告系统,忽略所有发出的警告。这在生产代码中通常不推荐,因为它会隐藏潜在的问题,但在开发或测试环境中,如果警告信息太多干扰调试,可能会暂时使用。

import urllib3
import elasticsearch
from elasticsearch import Elasticsearch
import warnings
from pprint import pprint

# 禁用所有警告
warnings.filterwarnings("ignore")

print(elasticsearch.VERSION)
# 禁用警告
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

url = "https://ip:9200/"
user_passwd = ('user', 'passwd')

# 建立连接
es = Elasticsearch(
    [url],
    http_auth=user_passwd,
    verify_certs=False,
)

# 检查集群健康状态
health = es.cluster.health()
pprint(health)

2. 准备示例数据

在进行查询之前,我们需要在 Easyearch 中创建一些示例数据。

# 定义示例数据
sample_data = [
    {"index": {"_index": "my_index"}},
    {"field": "value1", "another_field": 10},
    {"index": {"_index": "my_index"}},
    {"field": "value2", "another_field": 20},
    {"index": {"_index": "my_index"}},
    {"field": "value3", "another_field": 30},
    {"index": {"_index": "my_index"}},
    {"field": "bulk_value1", "another_field": 100},
    {"index": {"_index": "my_index"}},
    {"field": "bulk_value2", "another_field": 200},
    {"index": {"_index": "my_index"}},
    {"field": "bulk_value3", "another_field": 300}
]

# 批量插入示例数据
response = es.bulk(body=sample_data)
print(response)

3. 使用 REST API 进行查询

REST API 是与 EasySearch 进行通信的常用方式。通过 REST API,开发者可以发送 HTTP 请求来执行各种操作,包括索引文档、搜索数据等。以下示例展示了如何在 Python 中执行 REST 查询。

由于是REST API,我们可以先使用Postman进行测试。

在这里插入图片描述

我们可以看到HTTP端点可以正常返回,然后就可以使用编程方式进行访问了:

import requests
from requests.auth import HTTPBasicAuth
from pprint import pprint

url = "https://ip:9200/"
user_passwd = ('user', 'passwd')

# 构建查询参数
query = {
    "query": {
        "match": {
            "field": "value1"
        }
    }
}

dsl = f"{url}/my_index/_search"

response = requests.get(dsl, json=query, auth=HTTPBasicAuth(*user_passwd), verify=False)
pprint(response.json())

# 处理查询结果
if response.status_code == 200:
    results = response.json()
    for hit in results['hits']['hits']:
        print(hit)
else:
    print(f"Error: {response.status_code}")

4. 使用 Elasticsearch Python SDK 进行 DSL 增删改查

DSL(Domain-Specific Language)是 Elasticsearch/EasySearch的原生查询语言,允许用户构建复杂的查询。以下示例展示了如何在 Elasticsearch Python SDK 中执行 DSL 查询。

# 构建 DSL 查询
dsl_query = {
    "query": {
        "match": {
            "field": "value1"
        }
    }
}

# 执行 DSL 查询
response = es.search(index="my_index", body=dsl_query)

results = response.get("hits")
# 处理查询结果
if results:
    for hit in results['hits']:
        print(hit)
else:
    print(f"Error: {response.status_code}")

插入数据

如果不指定document ID,那么随机生成一个ID并写入。

doc = {"field": "value4", "another_field": 9999}
response = es.index(index="my_index", body=doc)
print(response)

更新数据

指定ID为1来手动更新索引:

doc = {"field": "value4", "another_field": 9999}
response = es.index(index="my_index", body=doc, id=1)
print(response)

更新单条数据

# 更新单条数据
update_body = {"doc": {"another_field": 50}}
response = es.update(index="my_index", id="1", body=update_body)
pprint(response)

删除数据

# 删除单条数据
response = es.delete(index="my_index", id="1")
pprint(response)

5. 使用 Elasticsearch Python SDK 进行 SQL 查询

创建客户端实例后,我们可以使用 sql 方法执行 SQL 查询。以下示例展示了如何执行一个简单的 SELECT 查询。

# 执行 SQL 查询
query_sql = {
    "query": "SELECT * FROM my_index"
}

res = es.sql.query(body=query_sql)
pprint(res)

6. 使用 Elasticsearch Python SDK 进行批量操作

批量操作 API 允许用户一次性对多个文档进行创建、更新或删除操作,极大提高了操作效率。以下示例展示了如何使用 Elasticsearch Python SDK 中的批量操作。

批量插入数据

# 定义批量插入数据
bulk_data = [
    {"index": {"_index": "my_index"}},
    {"field": "bulk_value1", "another_field": 100},
    {"index": {"_index": "my_index"}},
    {"field": "bulk_value2", "another_field": 200},
    {"index": {"_index": "my_index"}},
    {"field": "bulk_value3", "another_field": 300}
]

# 执行批量插入操作
response = es.bulk(body=bulk_data)
pprint(response)

批量更新数据

# 定义批量更新数据
bulk_update_data = [
    {"update": {"_id": "1", "_index": "my_index"}},
    {"doc": {"another_field": 110}},
    {"update": {"_id": "2", "_index": "my_index"}},
    {"doc": {"another_field": 220}}
]

# 执行批量更新操作
response = es.bulk(body=bulk_update_data)
pprint(response)

批量删除数据

# 定义批量删除数据
bulk_delete_data = [
    {"delete": {"_id": "1", "_index": "my_index"}},
    {"delete": {"_id": "2", "_index": "my_index"}}
]

# 执行批量删除操作
response = es.bulk(body=bulk_delete_data)
print(response)

7. 使用 Elasticsearch Python SDK 进行索引级别操作

Elasticsearch Python SDK 还支持索引级别的操作,如创建索

引、删除索引和检查索引是否存在。以下是一些示例:

创建索引

# 创建索引
index_body = {
    "settings": {
        "number_of_shards": 1,
        "number_of_replicas": 0
    },
    "mappings": {
        "properties": {
            "field": {"type": "text"},
            "another_field": {"type": "integer"}
        }
    }
}
response = es.indices.create(index="new_index", body=index_body)
pprint(response)

删除索引

# 删除索引
response = es.indices.delete(index="new_index")
pprint(response)

检查索引是否存在

# 检查索引是否存在
response = es.indices.exists(index="new_index")
pprint(response)

8. 总结

Elasticsearch Python SDK 提供了一种简便的方法,使得开发者可以通过熟悉的 DSL 和 SQL 语法对 EasySearch 进行查询。同时,SDK 还提供了一些高级功能如批量操作 API,使得查询和数据操作更加高效。开发者可以更灵活地构建复杂查询,充分利用 EasySearch 的强大功能。无论您是执行简单的 SQL 查询,还是构建复杂的 DSL 和 REST 查询,Elasticsearch Python SDK 都能满足您的需求。如果您还未尝试过这个强大的工具,现在就安装并使用它吧!通过 EasySearch,您将能够更加高效地处理和分析大数据集,为您的数据驱动决策提供有力支持。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1928932.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构与算法 经典例题】判断二叉树是否对称

💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:《数据结构与算法 经典例题》C语言 期待您的关注 目录 一、问题描述 二、解题思路 三、C语言实现代码 一、问题描述 给你一个二…

MySQL NaviCat 安装及配置教程(Windows)【安装】

文章目录 一、 MySQL 下载1. 官网下载2. 其它渠道 二、 MySQL 安装三、 MySQL 验证及配置四、 NaviCat 下载1. 官网下载2. 其它渠道 五、 NaviCat 安装六、 NaviCat 激活 软件 / 环境安装及配置目录 一、 MySQL 下载 1. 官网下载 安装地址:https://www.mysql.com/…

Python | Leetcode Python题解之第237题删除链表中的节点

题目: 题解: class Solution:def deleteNode(self, node):node.val node.next.valnode.next node.next.next

OrangePi Aipro Ai计算测试

开发板配置 http://www.orangepi.cn/html/hardWare/computerAndMicrocontrollers/details/Orange-Pi-AIpro.html CPU4核64位处理器 AI处理器GPU集成图形处理器AI算力8-12TOPS算力内存LPDDR4X:8GB/16GB(可选),速率:3200…

让AI语言模型自由飞翔:LangChain框架的奇妙世界

今天,我将为大家揭开一项令人激动的技术——LangChain。想象一下,如果能将人工智能的强大能力与我们日常使用的数据和工具无缝连接,那将开启怎样崭新且无限的可能! LangChain,一个专为大型语言模型设计的框架&#xf…

Linux FFmpeg安装教程

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

Windows安装Pycharm及汉化教程

在安装好了Python之后呢,我们需要更方便的进行编写代码,使用Python自带的IDLE和命令行是不太友好的。 那么有没有一款免费好用的写代码工具呢?答案是有的! PyCharm 是由 JetBrains 打造的一款 Python IDE,提供代码分析…

【Django】网上蛋糕项目商城-注册,登录,修改用户信息,退出功能

概念 通过以上多篇文章的讲解,对该项目的功能已经实现了很多,本文将对该项目的用户注册,登录,修改用户信息,以及退出等功能的实现。 注册功能实现 点击head.html头部页面的注册按钮,触发超链接跳转至use…

K8s集群初始化遇到的问题

kubectl describe pod coredns-545d6fc579-s9g5s -n kube-system 找到原因1:CoreDNS Pod 处于 Pending 状态的原因是集群中的节点都带有 node.kubernetes.io/not-ready 污点 journalctl -u kubelet -f 14:57:59.178592 3553 remote_image.go:114] "PullIma…

火车行驶动态特效404单页源码

源码介绍 火车行驶动态特效404单页源码,白云飘飘,小火车带着not page found行驶远方,适合做网站错误页,将下面的代码放到空白的html文件里面,鼠标双击即可查看效果,或者上传到服务器,设置好重定向即可 效果预览 完整代码 <!DOCTYPE html> <html><head…

【ROS2】高级:实现自定义内存分配器

目标&#xff1a;本教程将展示在编写 ROS 2 C 代码时如何使用自定义内存分配器。 教程级别&#xff1a;高级 时间&#xff1a;20 分钟 目录 背景 编写分配器编写一个示例主程序将分配器传递到进程内管道测试和验证代码 TLSF 分配器 本教程将教您如何为发布者和订阅者集成自定义…

【个人笔记】685. 冗余连接 II 的解释(并查集)

一棵树有n个点和n条边&#xff0c;返回一条能删除的边&#xff0c;使得剩下的图是有 n 个节点的有根树。 解释&#xff1a; 注意不冗余的有根树的特性&#xff01;**根节点入度为0&#xff0c;其余结点只有一个入度&#xff01;**所以冗余的两种情况如下&#xff1a; &#xff…

jmeter持续学习之---控制器

IF控制器 下面这种写法jmeter不推荐有性能的问题 jmeter推荐勾选上的这种写法 使用"Interpret Condition as Variable Expression"工具的性能要好一些 循环控制器 ForEach控制器 与用户定义的变量或者正则表达式提取器配合使用,循环读取。用户定义的变量或者正则…

彻底改变时尚:使用 GAN 实现 AI 的未来

彻底改变时尚&#xff1a;使用 GAN 实现 AI 的未来 一、介绍 想象一下&#xff0c;在这个世界里&#xff0c;时装设计师永远不会用完新想法&#xff0c;我们穿的每一件衣服都是一件艺术品。听起来很有趣&#xff0c;对吧&#xff1f;好吧&#xff0c;我们可以在通用对抗网络 &a…

路网双线合并单线——ArcGISpro 解决方法

路网双线合并成单线是一个在地图制作、交通规划以及GIS分析中常见的需求。双线路网定义&#xff1a;具有不同流向、不同平面结构的道路。此外&#xff0c;车道数较多的道路&#xff08;例如&#xff0c;双黄实线车道数大于4的道路&#xff09;也可以视为双线路网&#xff0c;本…

C++相关概念和易错语法(22)(final、纯虚函数、继承多态难点)

1.final final在继承和多态中都可以使用&#xff0c;在继承中是指不想将自己被继承&#xff0c;在多态中是指不想该函数被重写&#xff0c;比较简单&#xff0c;下面是一些使用例子。 2.纯虚函数 当我们需要抽象一个类的时候&#xff0c;我们就需要用到纯虚函数。所谓抽象的类…

深入理解I/O模型

目录 一、I/O 模型简介 二、I/O 模型 2.1 同步阻塞 I/O 2.2 同步非阻塞I/O 2.3 I/O多路复用 2.4 异步I/O 2.5 信号驱动 I/O 三、总结 一、I/O 模型简介 所谓的 I/O 就是计算机内存与外部设备之间拷贝数据数据的过程。有 5 中 I/O 模型&#xff0c;分别是同步阻塞 I/O、同步…

单端、差分信号处理抗干扰能力解析

采用仪表运放对信号源进行处理&#xff0c; 信号源地上有共模干扰&#xff0c;经过差分信号处理后Vout上不会有干扰&#xff0c;差分信号可以非常好的抗共模干扰。 经过差分信号处理后&#xff0c;以单端信号输出进入ADC还是会有干扰&#xff0c;所以信号链采用差分 处理后&…

Java二十三种设计模式-适配器模式(6/23)

适配器模式&#xff1a;使不兼容的接口协同工作的桥梁 引言 适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许不兼容的接口之间可以一起工作&#xff0c;通过将一个类的接口转换成客户端期望的另一个接口。 在计算机编程中&#x…

AI论文精读笔记-MAE

1. 论文基本信息 论文标题&#xff1a;Masked Autoencoders Are Scalable Vision Learners 作者&#xff1a;Kaiming He∗,† Xinlei Chen∗ Saining Xie Yanghao Li Piotr Doll ́ ar Ross Girshick 发表时间和期刊&#xff1a;19 Dec 2021; arxiv 论文链接&#xff1a;Mas…