暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

基于 Cloudberry 的全文检索方案对比:ParadeDB BM25 vs GIN vs ZomboDB

HashData 1天前
31

Apache Cloudberry™ (Incubating) 是 Apache 软件基金会孵化项目,由 Greenplum 和 PostgreSQL 衍生而来,作为领先的开源 MPP 数据库,可用于建设企业级数据仓库,并适用于大规模分析和 AI/ML 工作负载。

GitHub:  https://github.com/apache/cloudberry

文章作者:杨江华,酷克数据内核研发工程师;整理:酷克数据


本文基于 Apache Cloudberry 主分支 3.0(该版本尚未正式发布,仅为开发分支),对三种 PostgreSQL 生态下的全文检索实现方案 —— ParadeDB BM25(通过 pg_search 测试)、Postgres GIN(trigram) 与 ZomboDB —— 进行了系统的性能对比测试。

测试内容涵盖索引构建时间、查询性能以及内存消耗等关键指标,旨在评估它们在大规模文本检索场景下的实际表现,为 Cloudberry 用户与数据库开发者在选择全文检索方案时提供参考依据。

测试环境

测试在一台配备 4 核 CPU 与 16GB 内存 的环境中进行,Apache Cloudberry 版本为 3.0 main,数据集来自公开的 All The News 2.1(https://www.dropbox.com/s/cn2utnr5ipathhh/all-the-news-2-1.zip?dl=0),共包含 2,688,878 篇新闻与文章,来自 27 家美国出版物。检索字段:date, year, month, day, author, title, article, url, section, publication

表结构如下:

    CREATE TABLE news (
      id bigserial PRIMARY KEY,
      pub_date timestamp,
      pub_year integer,
      pub_month char(5),
      pub_day integer,
      author text,
      title text,
      article text,
      url text,
      section text,
      publication text
    ) DISTRIBUTED BY (id);


    postgres=select count(*from news;
      count  
    ---------
     2688878
    (1 row)




    ---

    1. ParadeDB BM25 索引

    ParadeDB BM25 是 ParadeDB 推出的全文搜索插件,底层基于向量化 BM25 排序算法,能够高效支持大规模文本的相关度检索。在 Cloudberry 中可通过 pg_search 进行集成,具有查询性能高、内存占用低等特点,但当前版本暂不支持 JOIN 查询。

      CREATE INDEX news_article_bm25_idx ON news USING bm25 (id, article)
      WITH (key_field = 'id', text_fields = '{"article": {"fast": true}}');

      2. GIN 索引(trigram)

      Postgres GIN(trigram) 是 Apache Cloudberry 数据库的内置全文检索插件,基于 PostgreSQL 核心模块 pg_trgm 实现。它通过三元组(trigram)索引支持相似度匹配与文本搜索,无需外部依赖,集成度高、部署简便,是 Cloudberry 默认可用的全文检索方式之一。

        CREATE INDEX gin_idx ON news USING gin (article gin_trgm_ops);

        3. ZomboDB 索引

        ZomboDB 则是一个将 PostgreSQL 与 Elasticsearch 无缝集成的扩展,它允许用户在 SQL 中直接使用 Elasticsearch 的搜索能力。ZomboDB 既能利用 PostgreSQL 的事务一致性,又能获得 Elasticsearch 的全文检索与布尔查询性能,适合需要复杂搜索逻辑或外部检索接口的场景。目前,ZomboDB for Apache Cloudberry 尚未正式开源,仍处于计划阶段。本次测试使用的是兼容版本,仅用于评估其在 Cloudberry 环境下的潜在性能表现。

          CREATE INDEX news_zdb_idx ON news USING zombodb ((news.*))
          WITH (url='http://localhost:9200/');

          索引构建时间对比

          性能对比结果

          单词语义搜索

          搜索词

          ParadeDB BM25

          GIN (trigram)

          ZomboDB

          结果数量

          'the'

          71.07s

          99.15s

          78.37s

          ~2.4M

          'table'

          23.55s

          92.80s

          27.50s

          ~74K

          'abcd'

          0.09s

          0.11s

          0.21s

          152

          复合查询

          查询条件

          ParadeDB BM25

          GIN (trigram)

          ZomboDB

          结果数量

          'table OR china'

          25.66s

          50.74s

          43.66s

          ~327K

          'table AND china'

          4.08s

          69.80s

          4.95s

          ~9.7K


          详细分析

          高频词搜索 ('the')

          • ParadeDB BM25: 71.07秒(最快)
          • ZomboDB: 78.37秒
          • GIN: 99.15秒(最慢)

          中频词搜索 ('table')

          • ParadeDB BM25: 23.55秒(最快)
          • ZomboDB: 27.50秒
          • GIN: 92.80秒(最慢)

          低频词搜索 ('abcd')

          • 所有索引表现都很好,差异不大
          • GIN索引略快(0.11秒)

          复合查询表现

          • AND查询: ParadeDB BM25领先(4.08秒)
          • OR查询: ParadeDB BM25最快(25.66秒)
          • GIN索引在OR查询中表现最差

          内存使用情况

          • ParadeDB BM25: 查询时内存使用约120MB
          • GIN索引: 内存使用较高,可达1.4GB
          • ZomboDB: 内存使用适中,约120MB

          结语

          综合来看,三种全文检索方案各有特点:

          • ZomboDB:索引构建最快,对需要频繁重建或快速上线的场景友好;查询表现稳定、支持复杂布尔检索,适合对索引部署速度和扩展能力有要求的应用。
          • GIN (trigram):构建时间居中,但查询(尤其高频与复合 OR)性能较差且内存开销大,优点是实现简单、与 PostgreSQL 集成度高,适合轻量或对部署依赖原生扩展的场景。
          • ParadeDB BM25:查询性能总体最佳(特别是相关度/高频检索与复合查询),且内存使用低,但索引构建时间略长,并且当前功能限制(例如暂不支持 JOIN)需要在应用设计时考虑。

          总体来看,ParadeDB BM25 更适合以文本相关度与查询性能为核心的全文检索场景;ZomboDB 适合需要复杂布尔逻辑与搜索功能扩展的应用;而 GIN (trigram) 更适用于轻量级、低频次的文本匹配任务。

          本次测试结果可为 Cloudberry 用户与数据库开发者在选择 PostgreSQL 生态下的全文检索方案时提供有价值的参考。

          加入 Apache Cloudberry 社区

          Apache Cloudberry 始终遵循公开中立原则,欢迎各位兴趣爱好者、开发者、社区用户加入:

          • 访问网站:https://cloudberry.apache.org
          • 关注 GitHub:https://github.com/apache/cloudberry
          • 加入 Slack 空间:https://apache-cloudberry.slack.com
          • 订阅 Dev 邮件列表:查看订阅方式及过往邮件归档 - https://cloudberry.apache.org/community/mailing-lists

          👇🏻️扫码加入 Apache Cloudberry 交流群👇🏻️

          文章转载自HashData,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

          评论