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 執行個體
-
購買Hologres執行個體 V4.1 版本執行個體並建立資料庫。
-
建立使用者。具體操作,請參見使用者管理。
-
-
準備 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 在全文檢索索引類查詢(如 term、phrase)和彙總分析情境均可達到優異的響應效能。
|
查詢名稱 |
平均時間(毫秒) |
|
|
6 |
|
|
7 |
|
|
7 |
|
|
7 |
|
|
9 |
|
|
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;