本文演示如何使用 elsatiscsearch_dsl
+ elasticsearch
在 FastAPI 下完成异步插入 ES 数据。
对 Elasticsearch 的异步操作需要 Python 库 elasticsearch>=7.8.0
,若不符合版本要求的话需要进行安装或更新。
1. 创建 ES Client
在 dependences.py
中书写 ES Client 依赖:
from elasticsearch import AsyncElasticsearch
from functools import lru_cache
@lru_cache
def get_es() -> AsyncElasticsearch:
"""
获取 ES Client 对象
"""
return AsyncElasticsearch(
hosts=['127.0.0.1', ],
port=9200,
timeout=200
)
2. 创建 Document 数据类型
假设我们创建一个用户类型,在持久层文件 es_po.py
中书写:
from elasticsearch_dsl import Document, Date, InnerDoc, Keyword, Text, Integer
from datetime import datetime
class UserInEs(Document):
updated_time = Date()
uid = Text(fields={'raw': Keyword()})
screen_name = Text()
age = Integer()
class Index:
"""在ES中的Index名"""
name = 'users'
def save(self, **kwargs):
self.updated_time = datetime.now()
return super().save(**kwargs)
3. 在 ES 创建 index (只需要做一次)
可以通过 ES 客户端创建,也可以通过以下 Python 实现:
from dependencies import get_es
from es_po import UserInEs
es_client = get_es()
UserInEs.init(using=es_client)
4. 加入视图函数(controller)中
from fastapi import FastAPI, Depends
from pydantic import UserModel
from elasticsearch7 import AsyncElasticsearch
from elasticsearch.helpers import async_bulk
import uvicorn
from es_po import UserInEs
from dependencies import get_es
app = FastAPI()
class UserModel(BaseModel):
uid: str
screen_name: str
age: int
@app.post('/create')
async def create_user(user: UserModel,
es_client: AsyncElasticsearch = Depends(get_es)):
user_doc = UserInEs(**user.dict())
await async_bulk(es_client, [user_doc.to_dict(), ])
return {'data': 'success'}
uvicorn.run(app, '127.0.0.1', 8080)
5. 测试
向 127.0.0.1:8080/create
发送一个 POST 请求并携带相关参数就可完成在 ES 中的文档插入。