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

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 带你读《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

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
4天前
|
存储 数据库连接 API
Python环境变量在开发和运行Python应用程序时起着重要的作用
Python环境变量在开发和运行Python应用程序时起着重要的作用
38 15
|
1月前
|
算法 测试技术 开发者
性能优化与代码审查:提升Python开发效率
【10月更文挑战第12天】本文探讨了Python开发中性能优化和代码审查的重要性,介绍了选择合适数据结构、使用生成器、避免全局变量等性能优化技巧,以及遵守编码规范、使用静态代码分析工具、编写单元测试等代码审查方法,旨在帮助开发者提升开发效率和代码质量。
35 5
|
1月前
|
算法 测试技术 开发者
性能优化与代码审查:提升Python开发效率
【10月更文挑战第6天】本文探讨了性能优化和代码审查在Python开发中的重要性,提供了选择合适数据结构、使用生成器、避免全局变量等性能优化技巧,以及遵守编码规范、使用静态代码分析工具、编写单元测试等代码审查方法,旨在帮助开发者提升开发效率和代码质量。
54 5
|
16天前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
103 45
|
11天前
|
JSON 安全 API
如何使用Python开发API接口?
在现代软件开发中,API(应用程序编程接口)用于不同软件组件之间的通信和数据交换,实现系统互操作性。Python因其简单易用和强大功能,成为开发API的热门选择。本文详细介绍了Python开发API的基础知识、优势、实现方式(如Flask和Django框架)、实战示例及注意事项,帮助读者掌握高效、安全的API开发技巧。
37 3
如何使用Python开发API接口?
|
4天前
|
JSON API 数据格式
如何使用Python开发1688商品详情API接口?
本文介绍了如何使用Python开发1688商品详情API接口,获取商品的标题、价格、销量和评价等详细信息。主要内容包括注册1688开放平台账号、安装必要Python模块、了解API接口、生成签名、编写Python代码、解析返回数据以及错误处理和日志记录。通过这些步骤,开发者可以轻松地集成1688商品数据到自己的应用中。
19 1
|
10天前
|
数据采集 存储 JSON
Python爬虫开发中的分析与方案制定
Python爬虫开发中的分析与方案制定
|
17天前
|
数据可视化 开发者 Python
Python GUI开发:Tkinter与PyQt的实战应用与对比分析
【10月更文挑战第26天】本文介绍了Python中两种常用的GUI工具包——Tkinter和PyQt。Tkinter内置于Python标准库,适合初学者快速上手,提供基本的GUI组件和方法。PyQt基于Qt库,功能强大且灵活,适用于创建复杂的GUI应用程序。通过实战示例和对比分析,帮助开发者选择合适的工具包以满足项目需求。
62 7
|
19天前
|
算法 测试技术 开发者
性能优化与代码审查:提升Python开发效率
探讨了Python开发中性能优化和代码审查的重要性,介绍了选择合适数据结构、使用生成器、避免全局变量等性能优化技巧,以及遵守编码规范、使用静态代码分析工具、编写单元测试等代码审查方法,旨在帮助开发者提升开发效率和代码质量。
39 8
|
15天前
|
算法 测试技术 开发者
性能优化与代码审查:提升Python开发效率
性能优化与代码审查:提升Python开发效率
28 1

相关产品

  • 检索分析服务 Elasticsearch版