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

本文涉及的产品
Elasticsearch Serverless通用抵扣包,测试体验金 200元
简介: 带你读《Elastic Stack 实战手册》之65:——3.5.19.1.Elasticsearch语言开发(Python)(下)

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




、 常见的 API 使用

 

1. Index API

 

对 ES 单条写入只需要指定三部分信息:索引名,id, body。示例如下:

from datetime import datetime
from elasticsearch import Elasticsearch
#连接ES集群
es = Elasticsearch("192.168.2.2:27000")
#以JSON字符串的形式构建文档内容
doc = {
    'author': 'author_name',
    'text': 'Interesting content...',
    'timestamp': datetime.now(),
}
res = es.index(index="test-index", id=1, body=doc)
print(res['result'])

2. Get API

 

要获取一条文档需要指定其索引和 id

res = es.get(index="test-index", id=1)
#获取_source内的文档内容
print(res['_source'])

 3. Refresh API

 

ES接收数据请求时会先存入内存中,默认每隔一段时间会从内存 buffer 中将数据写入filesystem cache。如需手动 refresh ,可使用如下 API。


es.indices.refresh(index="test-index")

4. Search API


# 查询所有的数据
body = {
    "query":{
        "match_all":{}
    }
}
res = es.search(index="test-index",body=body)
print("Got %d Hits:" % res['hits']['total']['value'])
for hit in res['hits']['hits']:
    print("%(timestamp)s %(author)s: %(text)s" % hit["_source"])

5. Update API


doc = {
    'author': 'author_name',
    'text': 'Interesting modified content...',
    'timestamp': datetime.now(),
}
res = es.update(index="test-index", id=1, body=doc)
print(res['result'])

6. Delete API

es.delete(index="test-index", id=1)

7. Bulk API


elasticsearch 的 helpers 模块是对 bulk 的封装。Bulk API 接受索引、创建、删除和更新操作。使用 _op_type 字段指定操作(_op_type 默认为 index)

 

批量写入示例如下:


import random
from elasticsearch import Elasticsearch
from elasticsearch import helpers
es=Elasticsearch(hosts='192.168.2.2',port=27000)
meaningless_random_repeat=['python','elasticsearch','alibaba','bulk_helpers']
actions=[]
for i in range(10000):
    meaningless_random_repeat=meaningless_random_repeat[random.randrange(0,len(meaningless_random_repeat))]
    action={
            #操作 index update create delete  
            '_op_type':'index',
            #索引名
            '_index':'meaning_less_random_repeat',
            #索引type
            '_type':'_doc',  
            '_source':{'meaningless_random_repeat':meaningless_random_repeat}}
    actions.append(action)
helpers.bulk(client=es,actions=actions)
#这里使用streaming_bulk,如果设置线程数的需求可以使用parallel_bulk  
for ok,response in helpers.streaming_bulk(es,actions):
        if not ok:
            print(response)

8. Scan API

当我们需要使用大查询时可以使用 Scan API。Scan API 是对 scroll API 的简单封装。

from elasticsearch import Elasticsearch
from elasticsearch import helpers
es=Elasticsearch(hosts='192.168.2.2',port=27000)
query='{ "match": { "#Symbol": "FANCD2"}}}'
index = 'hgvs4variation'
source={'hgvs4variation':'hgvs4variation'}
datas = helpers.scan(es, index=index, query=body, size=1000, request_timeout=100, _source=source)
for data in datas:
    print(data)

、优化建议

 

1. 写入优化

 

针对日志类场景,对于写入速度要求很高而对数据的情况下:

 

l 不要单条导入,尽量使用 Bulk API。这样是为了提高写入效率。

l 可以先设置索引副本为0,写完恢复副本数。这样是为了降低索引副本分配产生的性能开销。

l 增加 Index Refresh 间隔,这样是为了减少 Segment Merge 的次数。

 

2. 查询优化

 

针对大查询的场景:

 

l 运维端可以根据当前的集群情况适当调整 max_result_window 参数。

l 开发端可以使用 ES 的 scroll API 或者 helpers 的 scan API,尽量控制每次拉取的条数以及避免深翻。

l 选择合适的路由,查询时可以根据 Routing 信息,直接定位到目标分片,避免查询所有的分片。


五、完整的代码示例

 

https://gitee.com/ld-sys/elasticsearch-python

 

参考

 

l https://www.elastic.co/guide/en/elasticsearch/client/python-api/current/index.html

 

创作人简介:

张刘毅,Elastic 认证工程师,存储研发工程师,曾经做过 AI 大数据平台研发,负责过80+ES集群。目前专注于生物医药和大数据。

博客:https://blog.csdn.net/dtzly

相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。  
相关文章
|
7天前
|
缓存 监控 前端开发
顺企网 API 开发实战:搜索 / 详情接口从 0 到 1 落地(附 Elasticsearch 优化 + 错误速查)
企业API开发常陷参数、缓存、错误处理三大坑?本指南拆解顺企网双接口全流程,涵盖搜索优化、签名验证、限流应对,附可复用代码与错误速查表,助你2小时高效搞定开发,提升响应速度与稳定性。
|
19天前
|
存储 JavaScript Java
(Python基础)新时代语言!一起学习Python吧!(四):dict字典和set类型;切片类型、列表生成式;map和reduce迭代器;filter过滤函数、sorted排序函数;lambda函数
dict字典 Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。 我们可以通过声明JS对象一样的方式声明dict
78 2
|
19天前
|
算法 Java Docker
(Python基础)新时代语言!一起学习Python吧!(三):IF条件判断和match匹配;Python中的循环:for...in、while循环;循环操作关键字;Python函数使用方法
IF 条件判断 使用if语句,对条件进行判断 true则执行代码块缩进语句 false则不执行代码块缩进语句,如果有else 或 elif 则进入相应的规则中执行
117 2
|
1月前
|
数据采集 机器学习/深度学习 人工智能
Python:现代编程的首选语言
Python:现代编程的首选语言
207 102
|
1月前
|
人工智能 自然语言处理 算法框架/工具
Python:现代编程的首选语言
Python:现代编程的首选语言
202 103
|
1月前
|
机器学习/深度学习 人工智能 数据挖掘
Python:现代编程的首选语言
Python:现代编程的首选语言
145 82
|
19天前
|
存储 Java 索引
(Python基础)新时代语言!一起学习Python吧!(二):字符编码由来;Python字符串、字符串格式化;list集合和tuple元组区别
字符编码 我们要清楚,计算机最开始的表达都是由二进制而来 我们要想通过二进制来表示我们熟知的字符看看以下的变化 例如: 1 的二进制编码为 0000 0001 我们通过A这个字符,让其在计算机内部存储(现如今,A 字符在地址通常表示为65) 现在拿A举例: 在计算机内部 A字符,它本身表示为 65这个数,在计算机底层会转为二进制码 也意味着A字符在底层表示为 1000001 通过这样的字符表示进行转换,逐步发展为拥有127个字符的编码存储到计算机中,这个编码表也被称为ASCII编码。 但随时代变迁,ASCII编码逐渐暴露短板,全球有上百种语言,光是ASCII编码并不能够满足需求
85 3
|
19天前
|
存储 JavaScript Java
(Python基础)新时代语言!一起学习Python吧!(一):认识Python、Py解释器作用;编写第一个Python程序;Python中的基本数据结构
认识Python 前提安装好Python,这里使用3.13版本 如今Python作为变成姐最炙手可热的编程语言,它的使用途径涵盖绝大部分生活中需要的开发需要。 许多大型网站就是用Python开发的,例如YouTube、Instagram,还有国内的豆瓣。很多大公司,包括Google、Yahoo等,甚至NASA都大量地使用Python。
300 1
|
2月前
|
机器学习/深度学习 自然语言处理 数据可视化
Python:简洁而强大的通用语言
Python:简洁而强大的通用语言
|
2月前
|
机器学习/深度学习 人工智能 运维
Python:简洁高效的万能语言
Python:简洁高效的万能语言

相关产品

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

    更多