带你读《Elastic Stack 实战手册》之65:——3.5.19.1.Elasticsearch语言开发(Python)(上)

简介: 带你读《Elastic Stack 实战手册》之65:——3.5.19.1.Elasticsearch语言开发(Python)(上)

3.5.19.Elasticsearch语言开发(Python/Nodejs/Java)

3.5.19.1.Elasticsearch语言开发(Python)

创作人:张刘毅

审稿人:周海清

 

简介

 

本节介绍如何使用 Python 操作 Elasticsearch(简称 ES ),将从以下几个方面进行阐述:

 

l 客户端选择

l 配置及初始化

l 常见 API 使用

l 优化建议

 

、客户端选择

 

Elasticsearch 官方提供了 low-level Python 客户端 elasticsearch-py,目的是为了给用

Python 代码操作 ES 提供统一、可扩展的编程接口。low-level Python 客户端的功能包括:

 

l 将 Python 的基本数据类型转换为 JSON

l 集群节点自动发现

l 负载平衡及线程安全

l 使用 helpers 的 bulk API 进行批量导入和 reindex 的功能

同时,官方也提供了建立在 elasticsearch-py 之上的高级库 elasticsearch-dsl,使用它可以更方便进行 DSL 查询。另外它还提供了一种类似 ORM 的方式将文档作为 Python 对象处理。

 

、 配置和初始化

 

1. 环境准备

 

Python 的客户端可以通过 pip 进行安装,我们选择国内的清华源加快下载速度:

pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple elasticsearch

如果有异步编程需求的可以下载

pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple elasticsearch[async]

2. 命令行测试

 

Python 由于其丰富的库函数和解释型语言特性使它成为多数平台上脚本测试的利器,我们在编写 Python 项目工程前可以在命令行里测试下和 ES 的交互是否正常。

>>> from datetime import datetime
>>> from elasticsearch import Elasticsearch
>>> es = Elasticsearch("localhost:9200")
>>> es.index(index="my-index-000001", doc_type="test-type", id=42, body={"any": "data", "timestamp": datetime.now()})
{'_index': 'my-index-000001', '_type': 'test-type', '_id': '42', '_version': 1, 'result': 'created', '_shards': {'total': 2, 'successful': 1, 'failed': 0}, '_seq_no': 0, '_primary_term': 1}

3. 初始化

客户端一般在全局作用域初始化,这样不仅提高性能也方便启用后台嗅探节点等功能。模版如下:

#导入es的python客户端
from elasticsearch import Elasticsearch
# 设置集群地址
client = Elasticsearch(
    ... # 客户端的配置信息
)
def main(request):
    ... # 使用客户端

l 指定连接

client = Elasticsearch(
    ['esnode1:port', 'esnode2:port'] 
    # 认证信息
    # http_auth=('elastic', 'changeme')
)

l 使用嗅探功能进行动态连接


client = Elasticsearch(
    ['esnode1:port', 'esnode2:port'],
    # 在做任何操作之前,先进行嗅探
    sniff_on_start=True,
    # 节点没有响应时,进行刷新,重新连接
    sniff_on_connection_fail=True,
    # 每 60 秒刷新一次
    sniffer_timeout=60
)
# 可以获取当前连接的节点来测试
 client.cluster.client.info()

4. 使用连接池

 

数据库是一项宝贵的资源,使用连接池技术可以减少连接开销从而提高程序性能。连接池是保存数据库连接实例的容器,ES 通过 ConnectionSelector 管理连接选择和无效连接。每次请求通过 get_connection 方法获取连接。如果连接失败将其标记 mark_dead 并设置超时,超时结束后将连接重新放回到连接池。

 

下面的代码示例中,使用 ES 类简单封装了 Elasticsearch 连接池的并发连接并示范了一个简单查询:查询含有 "FANCD2" 的 gene symbol。


# -*- coding=utf8 -*- 
import os
import json
from datetime import datetime
from elasticsearch import Elasticsearch, RequestsHttpConnection
from elasticsearch import Transport
from elasticsearch.exceptions import NotFoundError
class ES(object):
    # 索引的相关设置
    _index = "hgvs4variation"
    _type = "_doc"
    # ES类初始化设置,使用基于 requests 实例化 ES 连接池
    def __init__(self, hosts):
        self.conn_pool = Transport(hosts=hosts, connection_class=RequestsHttpConnection).connection_pool
    # 获取ES连接
    def get_conn(self):
        """
        从连接池获取一个连接
        """
        conn = self.conn_pool.get_connection()
        return conn
    #  向es集群发送一个请求
    def request(self, method, url, headers=None, params=None, body=None):
        conn = self.get_conn()
        try:
            status, headers, body = conn.perform_request(method, url, headers=headers, params=params, body=body)
        except NotFoundError as e:
            return None
              if method == "HEAD":
            return status
        return json.loads(body)
    def post(self, url, body=None, method="POST"):
        """使用post请求访问服务器"""
        data = self.request(method, url, body=body)
        return data
if __name__ == '__main__':
    ELASTICSEARCH = [{'host':'192.168.2.2','port':27000}]
    es=ES(ELASTICSEARCH)
    #获得连接
    res_conn = es.get_conn()
    print(res)
    #查询示例
    res_query = es.request(method='POST',body='{"query": { "match": { "#Symbol": "FANCD2"}}}',url='/_search')
    print(res_query)


 《Elastic Stack 实战手册》——三、产品能力——3.5 进阶篇——3.5.19.Elasticsearch语言开发(Python/Nodejs/Java)—— 3.5.19.1.Elasticsearch语言开发(Python)(下) https://developer.aliyun.com/article/1226662

相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。  
相关文章
|
4月前
|
存储 JavaScript Java
(Python基础)新时代语言!一起学习Python吧!(四):dict字典和set类型;切片类型、列表生成式;map和reduce迭代器;filter过滤函数、sorted排序函数;lambda函数
dict字典 Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。 我们可以通过声明JS对象一样的方式声明dict
324 1
|
4月前
|
算法 Java Docker
(Python基础)新时代语言!一起学习Python吧!(三):IF条件判断和match匹配;Python中的循环:for...in、while循环;循环操作关键字;Python函数使用方法
IF 条件判断 使用if语句,对条件进行判断 true则执行代码块缩进语句 false则不执行代码块缩进语句,如果有else 或 elif 则进入相应的规则中执行
522 1
|
5月前
|
数据采集 机器学习/深度学习 人工智能
Python:现代编程的首选语言
Python:现代编程的首选语言
521 102
|
5月前
|
人工智能 自然语言处理 算法框架/工具
Python:现代编程的首选语言
Python:现代编程的首选语言
311 103
|
5月前
|
机器学习/深度学习 人工智能 数据挖掘
Python:现代编程的首选语言
Python:现代编程的首选语言
249 82
|
6月前
|
存储 监控 算法
淘宝买家秀 API开发实录Python(2025)
本文讲述了作者在电商开发领域,尤其是对接淘宝买家秀 API 接口过程中所经历的挑战与收获。从申请接入、签名验证、频率限制到数据处理和实时监控,作者分享了多个实战经验与代码示例,帮助开发者更高效地获取和处理买家秀数据,提升开发效率。
|
9月前
|
API C++ 开发者
PySide vs PyQt:Python GUI开发史诗级对决,谁才是王者?
PySide 和 PyQt 是 Python GUI 开发领域的两大利器,各有特色。PySide 采用 LGPL 协议,更灵活;PyQt 默认 GPL,商业使用需授权。两者背后团队实力雄厚,PySide 得到 Qt 官方支持,PyQt 由 Riverbank Computing 打造。API 设计上,PySide 简洁直观,贴近原生 Qt;PyQt 增加 Pythonic 接口,操作更高效。性能方面,两者表现优异,适合不同需求的项目开发。选择时可根据项目特点与开源要求决定。
985 20
|
4月前
|
存储 Java 索引
(Python基础)新时代语言!一起学习Python吧!(二):字符编码由来;Python字符串、字符串格式化;list集合和tuple元组区别
字符编码 我们要清楚,计算机最开始的表达都是由二进制而来 我们要想通过二进制来表示我们熟知的字符看看以下的变化 例如: 1 的二进制编码为 0000 0001 我们通过A这个字符,让其在计算机内部存储(现如今,A 字符在地址通常表示为65) 现在拿A举例: 在计算机内部 A字符,它本身表示为 65这个数,在计算机底层会转为二进制码 也意味着A字符在底层表示为 1000001 通过这样的字符表示进行转换,逐步发展为拥有127个字符的编码存储到计算机中,这个编码表也被称为ASCII编码。 但随时代变迁,ASCII编码逐渐暴露短板,全球有上百种语言,光是ASCII编码并不能够满足需求
228 4
|
5月前
|
设计模式 人工智能 API
AI智能体开发实战:17种核心架构模式详解与Python代码实现
本文系统解析17种智能体架构设计模式,涵盖多智能体协作、思维树、反思优化与工具调用等核心范式,结合LangChain与LangGraph实现代码工作流,并通过真实案例验证效果,助力构建高效AI系统。
714 7

热门文章

最新文章

相关产品

  • 检索分析服务 Elasticsearch版
  • 推荐镜像

    更多