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;