全部產品
Search
文件中心

Hologres:基於 pmc 的全文檢索索引效能測試

更新時間:May 07, 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;