数据库中启用 pg_trgm 扩展
pg_trgm 是 PostgreSQL 的一个扩展,用于基于三元组(trigram)的相似性搜索。它可以用于改进全文检索的性能和准确性。
CREATE EXTENSION pg_trgm;
安装 zhparser 扩展
安装SCWS
wget -q -O - http://www.xunsearch.com/scws/down/scws-1.2.3.tar.bz2 | tar xf -
cd scws-1.2.3 ; ./configure ; make install
注意:在FreeBSD release 10及以上版本上运行configure时,需要增加—with-pic选项。
如果是从github上下载的scws源码需要先运行以下命令生成configure文件:
touch README;aclocal;autoconf;autoheader;libtoolize;automake --add-missing
编译安装zhparser
zhparser 是一个专门用于中文分词的 PostgreSQL 扩展。你需要从源码编译并安装它。
首先,确保你已经安装了 PostgreSQL 的开发包和其他必要的工具:
sudo apt-get install postgresql-server-dev-all build-essential
然后,下载并编译 zhparser:
git clone https://github.com/amutu/zhparser.git
cd zhparser
make
sudo make install
在你的数据库中启用 zhparser 扩展:
CREATE EXTENSION zhparser;
分词
SELECT * FROM ts_parse('zhparser', 'hello world! 2010年保障房建设在全国范围内获全面启动,从中央到地方纷纷加大 了保障房的建设和投入力度 。2011年,保障房进入了更大规模的建设阶段。住房城乡建设部党组书记、部长姜伟新去年底在全国住房城乡建设工作会议上表示,要继续推进保障性安居工程建设。');
Example
— 启用扩展 CREATE EXTENSION pg_trgm; CREATE EXTENSION zhparser;
— 创建全文检索配置 CREATE TEXT SEARCH CONFIGURATION chinese (PARSER = zhparser); ALTER TEXT SEARCH CONFIGURATION chinese ADD MAPPING FOR n,v,a,i,e,l WITH simple;
— 创建表和插入数据 CREATE TABLE documents ( id SERIAL PRIMARY KEY, title TEXT, body TEXT );
INSERT INTO documents (title, body) VALUES (‘PostgreSQL 教程’, ‘PostgreSQL 是一个强大的开源对象关系数据库系统。’), (‘全文检索’, ‘PostgreSQL 提供了强大的全文检索功能。’), (‘Python 编程’, ‘Python 是一种流行的编程语言,用于 Web 开发、数据分析等。’);
— 创建全文检索索引 CREATE INDEX idx_fts_body ON documents USING gin(to_tsvector(‘chinese’, body));
— 执行全文检索查询 SELECT * FROM documents WHERE to_tsvector(‘chinese’, body) @@ to_tsquery(‘chinese’, ‘PostgreSQL’);
实际测试
SELECT * FROM chunks WHERE to_tsvector(‘chinese’, content) @@ to_tsquery(‘chinese’, ‘小红书数据’); 结果:无 原因:to_tsquery适用于已经是合法查询表达式的输入,适合处理复杂查询。 条件:完整查询’小红书数据’
SELECT * FROM chunks WHERE to_tsvector(‘chinese’, content) @@ plainto_tsquery(‘chinese’, ‘小红书数据’); 结果:有 原因:plainto_tsquery,适用于自然语言输入,会自动分词并生成查询表达式,适合处理简单查询。 条件:‘小红书’ & ‘数据’
使用GIN索引
GIN(Generalized Inverted Index)索引是 PostgreSQL 提供的一种适用于全文搜索的索引类型。它可以显著提高全文搜索的查询速度。
-- 为 chunks 表中的 content 字段创建 GIN 索引
CREATE INDEX idx_chunks_content ON chunks USING GIN (to_tsvector('chinese', content));