Elasticsearch DSL:用 Python 对象写查询,不用再手写 JSON

elasticsearch-dsl-py 在 GitHub 上拿到了 3.8K Star。

Elastic 官方开源了这个库,目的是让 Python 开发者用更舒服的方式写 Elasticsearch 查询。

1、解决了什么问题

写过 Elasticsearch 查询的人都清楚:把查询写成 JSON 字典,嵌套一深就容易写错层级。加一个 filter 要在多层括号里找位置,聚合查询写完后自己都看不懂。

这个库把 JSON 查询包成 Python 对象,用方法链构造查询。

2、代码对比一下

官方 README 拿两种写法做了对比。

原生写法:

python 复制代码
response = client.search(
    index="my-index",
    body={
      "query": {
        "bool": {
          "must": [{"match": {"title": "python"}}],
          "must_not": [{"match": {"description": "beta"}}],
          "filter": [{"term": {"category": "search"}}]
        }
      },
      "aggs" : {
        "per_tag": {
          "terms": {"field": "tags"},
          "aggs": {
            "max_lines": {"max": {"field": "lines"}}
          }
        }
      }
    }
)

换成 DSL 之后:

python 复制代码
s = Search(using=client, index="my-index") \
    .filter("term", category="search") \
    .query("match", title="python")   \
    .exclude("match", description="beta")

s.aggs.bucket('per_tag', 'terms', field='tags') \
    .metric('max_lines', 'max', field='lines')

response = s.execute()

库自动处理了 bool 查询组合、filter 和 query 的上下文区分。返回结果直接用属性访问,不用从字典里逐层提取。

3、模型映射

这个库提供了 Document 类,可以用 Python 对象操作 ES 文档:

python 复制代码
class Article(Document):
    title = Text(analyzer='snowball', fields={'raw': Keyword()})
    tags = Keyword()
    published_from = Date()
    lines = Integer()

    class Index:
        name = 'blog'

article = Article(meta={'id': 42}, title='Hello world!')
article.save()

字段类型、索引配置、自定义方法都写在类里,比手写 mapping JSON 直观得多。框架还提供了数据校验、save 生命周期钩子等功能。

4、重要变化

8.18.0 版本之后,这个库被合并到了官方的 elasticsearch-py 客户端。不再需要单独安装 elasticsearch-dsl,只需把 elasticsearch_dsl 改成 elasticsearch.dsl 即可。

新项目可直接用 elasticsearch-py 8.18.0+,老项目也可以逐步迁移。8.18.0 版本会自动把旧 import 重定向到新位置,不会突然报错。

相关推荐
lichenyang4534 分钟前
鸿蒙元服务跳转 H5 太慢?从 Web 内核预热、网络预连接到骨架屏的完整优化方案
前端
aa小小12 分钟前
大屏的数据应该怎么做“实时更新“?大屏页面如果一直开着不关(比如挂了几天几夜),你觉得可能会出现什么问题,需要怎么预防?
前端·数据可视化
aa小小35 分钟前
Proxy 响应式原理
前端·proxy
计算机魔术师36 分钟前
Latent Space 访谈 TypeSafe CEO Diogo Almeida:Jev 是面向生产环境的 System One 模型而非万能 God 模型
前端
yzy851 小时前
Vue中下载或打开文件的JavaScript方法
前端·javascript·vue
用户298698530141 小时前
在 React 中用 JavaScript 将 Word 转换为文本
前端·javascript·react.js
计算机魔术师1 小时前
马斯克称 Grok 4.7 使 xAI 在智能体编码领域位列第三
前端
摸鱼仙人~1 小时前
前端秋招异步手写题系统刷题路线:从 Promise 到 Pipeline、LazyMan 与并发控制
前端
秋天的一阵风1 小时前
⚡上线 24 小时,13% 的付费团队连夜换到 Jev:它到底什么来头?
前端·人工智能·ai编程