YugabyteDB中的全文搜索技术详解

YugabyteDB中的全文搜索技术详解

yugabyte-db yugabyte/yugabyte-db: 是 YugaByte DB 的官方仓库,一个高性能、高可扩展、分布式的 SQL 数据库,支持 PostgreSQL 兼容性。适合对分布式数据库、SQL 数据库和云原生应用的开发者。 yugabyte-db 项目地址: https://gitcode.com/gh_mirrors/yu/yugabyte-db

全文搜索概述

在数据库应用中,简单的模式匹配操作符(如LIKE和ILIKE)虽然有用,但无法满足复杂搜索需求。YugabyteDB作为分布式SQL数据库,提供了强大的全文搜索功能,通过tsvector、tsquery和倒排索引等机制,实现了类似搜索引擎的高级文本检索能力。

环境准备

首先需要创建一个示例表来演示全文搜索功能:

CREATE TABLE movies (
    name TEXT NOT NULL,
    summary TEXT NOT NULL,
    PRIMARY KEY(name)
);

-- 插入示例数据
INSERT INTO movies(name, summary) 
VALUES('The Shawshank Redemption', 'Two convicts become friends and one convict escapes.');

INSERT INTO movies(name, summary) 
VALUES('The Godfather','A don hands over his business to one of his sons.');

INSERT INTO movies(name, summary) 
VALUES('Inception','A thief is given the task of planting an idea onto a mind');

文档解析与tsvector

全文搜索的核心是将文本转换为可搜索的向量表示:

SELECT to_tsvector('Two convicts become friends and one convict escapes.');

输出结果:

'becom':3 'convict':2,7 'escap':8 'friend':4 'one':6 'two':1

关键技术解析

  1. 词干提取(Stemming):将单词的不同形式转换为词根形式,如"escaping"→"escap"
  2. 停用词过滤(Stop Words):自动过滤常见无意义词如"a", "an", "the"等

查询解析与tsquery

查询也需要经过类似处理:

SELECT to_tsquery('escaping | business');

输出结果:

'escap' | 'busi'

搜索操作

使用@@操作符连接tsvector和tsquery进行搜索:

基本搜索类型

  1. OR搜索
SELECT * FROM movies WHERE to_tsvector(summary) @@ to_tsquery('one | son');
  1. AND搜索
SELECT * FROM movies WHERE to_tsvector(summary) @@ to_tsquery('one & son');
  1. NOT搜索
SELECT * FROM movies WHERE to_tsvector(summary) @@ to_tsquery('one & !son');

词干搜索示例

SELECT * FROM movies WHERE to_tsvector(summary) @@ to_tsquery('conviction');

即使原文中没有"conviction",也能匹配到包含"convict"的记录。

结果优化

相关性排序

使用ts_rank函数计算匹配分数并排序:

SELECT ts_rank(to_tsvector(summary), to_tsquery('one | son')) as score, * 
FROM movies;

高亮显示

使用ts_headline高亮匹配内容:

SELECT name, ts_headline(summary,to_tsquery('one | son')) 
FROM movies 
WHERE to_tsvector(summary) @@ to_tsquery('one | son');

多列搜索

可以同时搜索多个列:

SELECT * FROM movies 
WHERE to_tsvector(name || ' ' || summary) @@ to_tsquery('godfather | thief');

性能优化策略

预计算tsvector

添加tsvector列并自动更新:

ALTER TABLE movies ADD COLUMN tsv tsvector;
UPDATE movies SET tsv = to_tsvector(name || ' ' || summary);

-- 创建自动更新触发器
CREATE TRIGGER tsvectorupdate BEFORE INSERT OR UPDATE
    ON movies FOR EACH ROW EXECUTE FUNCTION
    tsvector_update_trigger (tsv, 'pg_catalog.english', name, summary);

使用GIN索引

创建GIN索引大幅提高查询性能:

CREATE INDEX idx_movie ON movies USING ybgin(tsv);

创建索引前后查询计划对比:

-- 索引前
EXPLAIN ANALYZE SELECT name FROM movies WHERE tsv @@ to_tsquery('godfather');
-- 索引后
EXPLAIN ANALYZE SELECT name FROM movies WHERE tsv @@ to_tsquery('godfather');

注意事项

  1. 当前ybgin实现仅支持单查询词查找
  2. 对于JSON数据,可以使用jsonb_path_ops优化子文档索引
  3. 大型文档应考虑部分索引策略

总结

YugabyteDB的全文搜索功能提供了企业级的文本检索能力,通过合理的索引和查询优化,可以在分布式环境中实现高效的文本搜索。开发者应充分利用tsvector预计算、GIN索引等特性来优化搜索性能。

yugabyte-db yugabyte/yugabyte-db: 是 YugaByte DB 的官方仓库,一个高性能、高可扩展、分布式的 SQL 数据库,支持 PostgreSQL 兼容性。适合对分布式数据库、SQL 数据库和云原生应用的开发者。 yugabyte-db 项目地址: https://gitcode.com/gh_mirrors/yu/yugabyte-db

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

邓尤楚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值