开发者
openGauss 全文检索
openGauss 全文检索
原创
发表于03/06
3660

一、核心数据类型

openGauss 为全文检索提供了两种关键数据类型:

  1. **tsvector**:表示为文本搜索优化的文档格式。它将文档解析为词素(lexeme)的有序组合,并存储词素位置信息,以支持邻近排序。词素是经过标准化处理的文本片段,如将大写字母转换为小写、删除后缀等。
  2. **tsquery**:表示文本查询。它包含已标注为词条的搜索词,并可使用 ANDORNOT 等操作符连接多个术语,实现复杂的查询逻辑。

二、基本文本匹配

使用 @@ 操作符可以判断一个 tsvector 是否匹配一个 tsquery。若匹配,则返回 true;否则返回 false。例如:

SELECT 'a fat cat sat on a mat and ate a fat rat'::tsvector @@ 'cat & rat'::tsquery AS result;
-- 返回结果:t(表示匹配成功)

三、文本预处理与索引创建

为提高搜索性能,openGauss 支持对文本字段创建全文索引。创建索引前,需使用 to_tsvector 函数将文本转换为 tsvector 格式。例如:

-- 创建包含 text 字段的表
CREATE TABLE tsearch.pgweb (
    id INT,
    body TEXT,
    title TEXT,
    last_mod_date DATE
);

-- 插入数据
INSERT INTO tsearch.pgweb VALUES (1, 'China, officially the People''s Republic of China (PRC), located in Asia, is the world''s most populous state.', 'China', '2010-1-1');
INSERT INTO tsearch.pgweb VALUES (2, 'America is a rock band, formed in England in 1970 by multi-instrumentalists Dewey Bunnell, Dan Peek, and Gerry Beckley.', 'America', '2010-1-1');

-- 创建 GIN 索引(需先转换文本格式)
CREATE INDEX pgweb_idx_1 ON tsearch.pgweb USING gin(to_tsvector('english', body));

四、全文检索查询示例

创建索引后,可执行高效的全文检索查询。例如,搜索 body 字段中包含 america 的文档:

SELECT id, body, title 
FROM tsearch.pgweb 
WHERE to_tsvector('english', body) @@ to_tsquery('america');

五、高级功能与优化

  1. 分词器控制:openGauss 支持多语言预定义分词器,如 pg_catalog.default(英文)、pg_catalog.ngrampg_catalog.pound(中文及中英混合)。用户可通过 ALTER DATABASE 或会话级设置调整分词器配置。
  2. 自定义文本搜索配置:允许用户创建自定义文本搜索配置,指定解析器、词典列表等组件,以满足特定搜索需求。
  3. 停用词处理:通过词典丢弃无意义的停用词(如“的”“是”),减少索引体积并提高搜索准确性。
  4. 查询扩展与同义词支持:支持创建同义词词典,使查询能匹配同义词或相关术语。

六、性能优势

  • 快速匹配:基于 tsvectortsquery 的预处理结构,实现毫秒级响应。
  • 高效索引:GIN 索引通过倒排列表加速查询,支持高并发场景。
  • 精准排序:根据词素位置信息计算相关性分数,确保结果按匹配度排序。

总结

openGauss 作为一款开源关系型数据库,提供了强大的全文检索功能,支持高效、精准的文本数据搜索。其全文检索功能基于匹配算子 @@ 实现,通过预处理文档和查询条件,将文本转换为可优化的数据结构,从而加速搜索过程。

收藏举报
Level 1
0
帖子
0
粉丝
0
获赞