全部产品
Search
文档中心

实时数仓Hologres:基于 pmc 的全文检索性能测试

更新时间:May 06, 2026

Hologres 自 V4.0 版本起支持全文倒排索引,实现高性能的全文检索能力。本文介绍 Hologres 基于 pmc 数据集进行全文检索性能测试的方法与结果。

数据集 pmc 源自 PubMed Central(PMC)的科学论文库。它包含约 57.4 万篇学术论文全文,原始数据大小约为 23.3 GB(压缩后约 5.9 GB)。每条记录包含 name(文章标识)、journal(期刊名)、date(发表日期)、volume(卷号)、issue(期号)、accession(PMC 编号)、timestamp(时间戳)、pmid(PubMed ID)和 body(论文正文)等字段。该数据集被广泛用作评估搜索引擎和数据库全文检索与学术文献分析性能的基准。

测试环境准备

测试资源:

  • Hologres:

    • 计算资源:48 CU

    • 版本:V4.1.12

    • 分片(Shard)数:6。如需增加计算节点数,建议对应线性增加分片数

  • ECS:

    • 规格:ecs.c9i.16xlarge 或 ecs.g9i.16xlarge

    • 操作系统:Debian 13.2 64 位

环境准备:

  • 准备 Hologres 实例

  • 准备 ECS 实例

    • 购买 ECS 实例。

    • 安装依赖

      # 更新 apt 缓存
      sudo apt update
      # 安装 PostgreSQL 客户端用于连接数据库
      sudo apt install -y postgresql-client
    • 数据集准备:从官方源下载并解压 pmc 数据集:

      mkdir ~/data && cd ~/data
      wget http://benchmarks.elasticsearch.org.s3.amazonaws.com/corpora/pmc/documents.json.bz2
      bunzip2 -k documents.json.bz2

性能测试

本文性能测试过程,包括 Hologres 建表、数据导入、索引构建,均由 Hologres 研发的开源测试工具完成,无需手动处理。测试工具详见Git 项目 alibabacloud-hologres-benchmark。建表样例详见附录。

  • 安装测试工具

    # 创建隔离环境
    sudo apt install -y python3-venv
    python3 -m venv .venv
    
    # 激活隔离环境
    source .venv/bin/activate
    python3 -m pip install -U pip
    
    # 安装依赖
    git clone https://github.com/aliyun/alibabacloud-hologres-benchmark.git
    cd alibabacloud-hologres-benchmark/fulltext_search/pmc
    pip3 install -r requirements.txt
  • 修改配置文件

    {
      "host": "<hologres_endpoint>",
      "port": <hologres_port>,
      "database": "<database_name>",
      "username": "<user_name>",
      "password": "<password>",
      "table_name": "pmc"
    }
  • 执行测试脚本

    cd alibabacloud-hologres-benchmark/fulltext_search/pmc
    
    # 包含数据导入、查询 benchmark 全流程,如数据已存在,则跳过导入步骤
    python3 hologres_benchmark.py \
        --config config.json \
        --queries-config benchmark_queries.yaml \
        --data-dir ~/data

测试结果

结果总览

指标

单位

Hologres 结果

数据导入时间

135.361

索引构建时间

303.154

数据准备总时间

438.516

数据+索引存储

GB

16

查询总耗时(100 次)

8.522

说明

说明:查询总耗时为 6 条查询分别连续执行 100 次的总时长。

性能详情:下表展示了各查询的平均响应时间(单位:毫秒)。Hologres 在全文检索类查询(如 termphrase)和聚合分析场景均可达到优异的响应性能。

查询名称

平均时间(毫秒)

default(match_all)

6

term

7

phrase

7

articles_monthly_agg_cached

7

articles_monthly_agg_uncached

9

scroll

49

附录:Hologres 建表与索引构建

  • Hologres 中创建测试表

    -- 创建新 Table Group,Shard 数设为 6
    CALL HG_CREATE_TABLE_GROUP ('tg_6', 6);
    
    -- 创建核心表
    CREATE TABLE pmc (
      id BIGINT PRIMARY KEY,
      name TEXT,
      journal TEXT,
      "date" TEXT,
      volume TEXT,
      issue TEXT,
      accession TEXT,
      "timestamp" timestamptz NOT NULL,
      pmid INTEGER,
      body TEXT
    ) WITH (
      table_group = 'tg_6',
      bitmap_columns = 'journal,"date",volume,issue,accession',
      segment_key = '"timestamp"',
      clustering_key = '"timestamp"',
      distribution_key = 'id'
    );
  • Hologres 中构建全文索引:针对多个字段创建全文倒排索引

    -- 创建全文索引
    CREATE INDEX pmc_accession_idx ON public.pmc USING fulltext(accession)
     WITH (
    tokenizer = 'keyword',
    analyzer_params = '{"tokenizer":{"type":"keyword"}}'
    );
    
    CREATE INDEX pmc_body_idx ON public.pmc USING fulltext(body)
     WITH (
    tokenizer = 'standard',
    analyzer_params = '{"filter":["lowercase"],"tokenizer":{"max_token_length":255,"type":"standard"}}'
    );
    
    CREATE INDEX pmc_date_idx ON public.pmc USING fulltext(date)
     WITH (
    tokenizer = 'standard',
    analyzer_params = '{"filter":["lowercase"],"tokenizer":{"max_token_length":255,"type":"standard"}}'
    );
    
    CREATE INDEX pmc_issue_idx ON public.pmc USING fulltext(issue)
     WITH (
    tokenizer = 'standard',
    analyzer_params = '{"filter":["lowercase"],"tokenizer":{"max_token_length":255,"type":"standard"}}'
    );
    
    CREATE INDEX pmc_journal_idx ON public.pmc USING fulltext(journal)
     WITH (
    tokenizer = 'standard',
    analyzer_params = '{"filter":["lowercase"],"tokenizer":{"max_token_length":255,"type":"standard"}}'
    );
    
    CREATE INDEX pmc_name_idx ON public.pmc USING fulltext(name)
     WITH (
    tokenizer = 'keyword',
    analyzer_params = '{"tokenizer":{"type":"keyword"}}'
    );
    
    CREATE INDEX pmc_volume_idx ON public.pmc USING fulltext(volume)
     WITH (
    tokenizer = 'standard',
    analyzer_params = '{"filter":["lowercase"],"tokenizer":{"max_token_length":255,"type":"standard"}}'
    );
    
    -- 执行索引全量构建
    VACUUM pmc;