使用 asyncio 与 Elasticsearch DSL

elasticsearch-dsl 包支持使用 asyncio 进行异步/等待。为了确保您拥有所有必要的依赖项,请安装 [async] 扩展

$ python -m pip install elasticsearch-dsl[async]

连接

使用 async_connections 模块来管理您的异步连接。

from elasticsearch_dsl import async_connections

async_connections.create_connection(hosts=['localhost'], timeout=20)

connections 模块中提供的所有选项都可以在 async_connections 中使用。

如何避免退出时出现“未关闭的客户端会话/连接器”警告

这些警告来自 aiohttp 包,该包在 AsyncElasticsearch 客户端内部使用。当应用程序退出时,它们经常出现,这是因为在垃圾回收时 HTTP 连接处于打开状态。为了避免这些警告,请确保您关闭了连接。

es = async_connections.get_connection()
await es.close()

搜索 DSL

使用 AsyncSearch 类执行异步搜索。

from elasticsearch_dsl import AsyncSearch

s = AsyncSearch().query("match", title="python")
async for hit in s:
    print(hit.title)

您可以显式调用 execute() 方法来获取 Response 对象,而不是将 AsyncSearch 对象用作异步迭代器。

s = AsyncSearch().query("match", title="python")
response = await s.execute()
for hit in response:
    print(hit.title)

还提供了一个 AsyncMultiSearch

from elasticsearch_dsl import AsyncMultiSearch

ms = AsyncMultiSearch(index='blogs')

ms = ms.add(AsyncSearch().filter('term', tags='python'))
ms = ms.add(AsyncSearch().filter('term', tags='elasticsearch'))

responses = await ms.execute()

for response in responses:
    print("Results for query %r." % response.search.query)
    for hit in response:
        print(hit.title)

异步文档、索引等

DocumentIndexIndexTemplateMappingUpdateByQueryFacetedSearch 类都有异步版本,它们使用相同的名称,并在前面加上 Async 前缀。这些类公开了与同步版本相同的接口,但任何执行 I/O 的方法都定义为协程。

不执行 I/O 的辅助类没有异步版本。相同的类可以在同步和异步应用程序中使用。

在异步应用程序中使用 自定义分析器 时,请使用 async_simulate() 方法在其上调用 Analyze API。

有关每个特定方法的详细信息,请参阅 API 文档 部分。