Elasticsearch DSL Python 持久化层使用指南

Elasticsearch DSL Python 持久化层使用指南

elasticsearch-dsl-py High level Python client for Elasticsearch elasticsearch-dsl-py 项目地址: https://gitcode.com/gh_mirrors/el/elasticsearch-dsl-py

概述

Elasticsearch DSL Python 库提供了一套强大的工具,用于定义 Elasticsearch 映射和构建应用程序的持久化层。本文将深入探讨如何使用该库的 Document 类来创建模型化的文档包装器,以及如何管理文档的完整生命周期。

Document 类基础

Document 类是 Elasticsearch DSL Python 中的核心组件,它允许您以面向对象的方式处理 Elasticsearch 文档。通过继承 Document 类,您可以定义文档的结构和行为。

基本定义示例

from datetime import datetime
from elasticsearch_dsl import Document, Date, Nested, Boolean, Text, Keyword

class Post(Document):
    title = Text()
    created_at = Date()
    published = Boolean()
    category = Text(fields={'raw': Keyword()})
    
    class Index:
        name = 'blog'

在这个例子中,我们定义了一个 Post 文档类型,包含标题、创建时间、发布状态和分类字段。Index 内部类指定了该文档所属的索引名称。

数据类型处理

原生 Python 类型

Document 实例使用原生 Python 类型:

  • 字符串使用 str
  • 日期时间使用 datetime
  • 布尔值使用 bool

特殊类型

对于复杂类型,库提供了专门的类:

  • InnerDoc 用于嵌套文档
  • Range 用于范围字段
from elasticsearch_dsl import Range

class RoomBooking(Document):
    dates = DateRange()

rb = RoomBooking(
    dates=Range(
        gte=datetime(2023, 1, 1),
        lt=datetime(2023, 1, 2)
    )
)

Python 类型注解

Elasticsearch DSL Python 支持使用标准 Python 类型注解来定义字段:

from typing import Optional, List

class Post(Document):
    title: str
    created_at: Optional[datetime]
    authors: List[str]

类型注解会自动映射到相应的 Elasticsearch 字段类型:

| Python 类型 | DSL 字段 | |------------|----------| | str | Text(required=True) | | bool | Boolean(required=True) | | datetime | Date(required=True) |

文档生命周期管理

初始化映射

在使用文档类型前,需要创建 Elasticsearch 映射:

Post.init()

创建文档

post = Post(title="My Post", published=True)
post.save()

检索文档

post = Post.get(id=42)

更新文档

post = Post.get(id=42)
post.update(published=True)

删除文档

post = Post.get(id=42)
post.delete()

高级特性

自定义分析器

您可以定义自己的分析器:

from elasticsearch_dsl import analyzer

my_analyzer = analyzer('my_analyzer',
    tokenizer='standard',
    filter=['lowercase', 'stop']
)

class Post(Document):
    content = Text(analyzer=my_analyzer)

搜索功能

Document 类提供了便捷的搜索方法:

s = Post.search()
s = s.filter('term', published=True)
results = s.execute()

for post in results:
    print(post.title)

日期处理注意事项

Elasticsearch 将没有时区信息的日期时间视为 UTC。您可以指定默认时区:

class Post(Document):
    created_at = Date(default_timezone='UTC')

最佳实践

  1. 映射初始化:在应用部署时运行映射初始化,类似于数据库迁移
  2. 类型注解:尽可能使用类型注解提高代码可读性
  3. 错误处理:适当处理文档不存在的场景
  4. 批量操作:使用 mget 进行批量检索提高效率

通过合理使用 Elasticsearch DSL Python 的持久化功能,您可以构建出既高效又易于维护的 Elasticsearch 集成层。

elasticsearch-dsl-py High level Python client for Elasticsearch elasticsearch-dsl-py 项目地址: https://gitcode.com/gh_mirrors/el/elasticsearch-dsl-py

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张萌纳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值