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 重定向到新位置,不会突然报错。

相关推荐
Java后端的Ai之路7 小时前
06-React-Props
前端·react.js·前端框架
Flynt8 小时前
开源"间谍卫星"说数据全是真的,我把它的免key数据源挨个试了一遍
前端·开源·数据可视化
Csvn8 小时前
渲染管线
前端
程序员大阳8 小时前
副队长CSS教程(33)–圆角与透明
前端·css·透明·圆角
志尊宝8 小时前
Vue3 零基础每日笔记(082):文件上传实战——el-upload 校验、自定义上传、头像预览
前端·javascript·vue.js·笔记·#javascript·#vue.js
鬼手点金9 小时前
opencode-rules 插件
java·开发语言·前端·人工智能·chrome·git·github
柳杉9 小时前
借助 Codex 和可视化工作流,从调研到完整实现,3D 大屏竟然可以这么简单
前端·ai编程·数据可视化
IMPYLH9 小时前
HTML 的 <wbr> 元素
前端·html
Dovis(誓平步青云)10 小时前
常用命令藏得太深?怎么做一个快捷命令坞
运维·前端·自动化·音视频·prometheus
IT_陈寒11 小时前
Vite的这个问题坑了我三天,原来如此解决!
前端·人工智能·后端