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和倒排索引等机制,实现了类似搜索引擎的高级文本检索能力。

全文搜索基础概念

文档处理流程

  1. 文本向量化(tsvector):将原始文本转换为包含词位(lexeme)和位置信息的向量
  2. 查询解析(tsquery):将搜索条件转换为标准化的查询表达式
  3. 匹配操作(@@):使用特殊运算符连接向量和查询进行匹配

实践演示

环境准备

首先创建一个电影信息表并插入示例数据:

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.'),
      ('The Godfather','A don hands over his business to one of his sons.'),
      ('Inception','A thief is given the task of planting an idea onto a mind');

文本处理示例

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

结果展示:

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

查询处理示例

SELECT to_tsquery('escaping | business');

结果展示:

'escap' | 'busi'

高级搜索功能

布尔搜索

  1. OR搜索:查找包含"one"或"son"的记录
SELECT * FROM movies WHERE to_tsvector(summary) @@ to_tsquery('one | son');
  1. AND搜索:查找同时包含"one"和"son"的记录
SELECT * FROM movies WHERE to_tsvector(summary) @@ to_tsquery('one & son');
  1. NOT搜索:查找包含"one"但不包含"son"的记录
SELECT * FROM movies WHERE to_tsvector(summary) @@ to_tsquery('one & !son');

词干提取(Stemming)搜索

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 
ORDER BY score DESC;

高亮显示

使用ts_headline函数高亮匹配内容:

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

性能优化策略

预处理存储

添加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);

创建索引后,查询计划从全表扫描变为索引扫描,性能显著提升。

注意事项

  1. 当前ybgin实现仅支持单查询项查找
  2. 对于JSON数据,可以使用jsonb_path_ops仅索引子文档
  3. 停用词处理会影响搜索结果

总结

YugabyteDB的全文搜索功能提供了企业级的文本检索能力,通过合理的预处理和索引策略,可以在分布式环境中实现高效的文本搜索。开发者可以根据实际需求选择适当的搜索方式和优化手段,构建高性能的搜索应用。

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
发出的红包

打赏作者

强和毓Hadley

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

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

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

打赏作者

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

抵扣说明:

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

余额充值