0
0
0
0
专栏/.../

TiDB 全文搜索功能公开测试中

 ShawnYan  发表于  2025-05-16

去年有小伙伴在 asktug.com 论坛讨论 TiDB 是否支持 全文搜索 (Full-text search)

其实这个需求早在 2016 年的时候就已经提出。

十年磨一剑,这个不是那么迫切的需求,在 AI 时代变成了刚需,近期终于在 TiDB Cloud Serverless 灰度上线。

2025 年 5 月 13 日,TiDB Cloud 版本更新。

TiDB Cloud Serverless 现已为 AI 应用程序提供全文搜索(测试版)。

TiDB Cloud Serverless 现已支持全文搜索(beta 版),使 AI 和检索增强生成 (RAG) 应用程序能够通过精确关键词检索内容。这与基于语义相似度检索内容的向量搜索相辅相成。两种方法的结合显著提升了 RAG 工作流中的检索准确率和答案质量。

主要功能包括:

  • 直接文本搜索:直接查询字符串列,无需嵌入。
  • 多语言支持:自动检测并分析多种语言的文本,即使在同一表中,也无需指定语言。
  • 基于相关性的排序:使用行业标准 BM25 算法对结果进行排序,以实现最佳相关性。
  • 原生 SQL 兼容性:无缝使用 SQL 功能(例如筛选、分组和连接)进行全文搜索。

现阶段,全文搜索功能已在Frankfurt (eu-central-1) 和 Singapore (ap-southeast-1)地区上线。

全文搜索功能演示

  1. 登陆 TiDB Cloud,在法兰克福创建一个数据库。

我的环境之前已经创建好数据库,可以直接使用。

  1. 创建带有全文索引的表。
CREATE TABLE stock_items(
    id INT,
    title TEXT,
    FULLTEXT INDEX (title) WITH PARSER MULTILINGUAL
);

  1. 给已存在的表添加全文索引。

需要先增加 TiFlash 副本,再创建索引。

CREATE TABLE t_text (id int, ct text);

ALTER TABLE t_text
SET TIFLASH REPLICA 2;

ALTER TABLE t_text 
ADD FULLTEXT INDEX (ct) 
WITH PARSER MULTILINGUAL;

其中,WITH PARSER <PARSER_NAME> 选项支持两个参数:

  • STANDARD:快速创建索引,适用于英文内容,用空格和标点符号分割单词。
  • MULTILINGUAL:支持多种语言,包括英语、中文、日语和韩语。
  1. 导入文本数据。

执行以下 SQL 写入多种语言的数据。

INSERT INTO stock_items VALUES (1, "イヤホン bluetooth ワイヤレスイヤホン ");
INSERT INTO stock_items VALUES (2, "完全ワイヤレスイヤホン/ウルトラノイズキャンセリング 2.0 ");
INSERT INTO stock_items VALUES (3, "ワイヤレス ヘッドホン Bluetooth 5.3 65時間再生 ヘッドホン 40mm HD ");
INSERT INTO stock_items VALUES (4, "楽器用 オンイヤーヘッドホン 密閉型【国内正規品】");
INSERT INTO stock_items VALUES (5, "ワイヤレスイヤホン ハイブリッドANC搭載 40dBまでアクティブノイズキャンセル");
INSERT INTO stock_items VALUES (6, "Lightweight Bluetooth Earbuds with 48 Hours Playtime");
INSERT INTO stock_items VALUES (7, "True Wireless Noise Cancelling Earbuds - Compatible with Apple & Android, Built-in Microphone");
INSERT INTO stock_items VALUES (8, "In-Ear Earbud Headphones with Mic, Black");
INSERT INTO stock_items VALUES (9, "Wired Headphones, HD Bass Driven Audio, Lightweight Aluminum Wired in Ear Earbud Headphones");
INSERT INTO stock_items VALUES (10, "LED Light Bar, Music Sync RGB Light Bar, USB Ambient Lamp");
INSERT INTO stock_items VALUES (11, "无线消噪耳机-黑色 手势触控蓝牙降噪 主动降噪头戴式耳机(智能降噪 长久续航)");
INSERT INTO stock_items VALUES (12, "专业版USB7.1声道游戏耳机电竞耳麦头戴式电脑网课办公麦克风带线控");
INSERT INTO stock_items VALUES (13, "投影仪家用智能投影机便携卧室手机投影");
INSERT INTO stock_items VALUES (14, "无线蓝牙耳机超长续航42小时快速充电 流光金属耳机");
INSERT INTO stock_items VALUES (15, "皎月银 国家补贴 心率血氧监测 蓝牙通话 智能手表 男女表");
  1. 使用 FTS_MATCH_WORD() 函数执行全文搜索,检索最相关的 10 个文档。
SELECT * FROM stock_items
WHERE fts_match_word("蓝牙耳机", title)
ORDER BY fts_match_word("蓝牙耳机", title)
DESC LIMIT 10;

需要注意,ORDER BYFTS_MATCH_WORD() 函数的参数需要与 WHERE 中的保持一致。

查看执行计划,注意到返回结果中包含 textSearch 信息。

"id","estRows","task","access object","operator info"
"TopN_11","10.00","root","","Column#4:desc, offset:0, count:10"
"└─TableReader_27","10.00","root","","MppVersion: 2, data:ExchangeSender_26"
"  └─ExchangeSender_26","10.00","mpp[tiflash]","","ExchangeType: PassThrough"
"    └─TopN_25","10.00","mpp[tiflash]","","Column#4:desc, offset:0, count:10"
"      └─TableFullScan_23","15.00","mpp[tiflash]","table:stock_items","textSearch:(top10 蓝牙耳机 IN test.stock_items.title)->Column#4, columns: [id, title, _FTS_SCORE], keep order:false, stats:pseudo"
  1. 使用 Python SDK (pytidb) 调用全文搜索。

pytidb 是 TiDB 的官方 Python SDK,旨在帮助开发者高效地构建 AI 应用程序。

🔍 支持多种搜索模式:向量搜索、全文搜索、混合搜索 🔄 自动嵌入生成 🎯 高级过滤功能 💱 支持事务 🔌 支持模型上下文协议 (MCP)

具体演示请参阅官方文档:

https://docs.pingcap.com/tidbcloud/vector-search-full-text-search-python

以及代码示例:

https://github.com/pingcap/pytidb/blob/main/examples/fulltext_search/main.py#L96

TiDB 近期资讯


Have a nice day ~


🌻 往期精彩 ▼

-- / END / --

👉 这里可以找到我

👉 这里有得聊

如果对国产基础软件(操作系统、数据库、中间件)感兴趣,可以加群一起聊聊。 关注微信公众号:少安事务所,后台回复[群],即可看到入口。

如果这篇文章为你带来了灵感或启发,请帮忙『三连』吧,感谢!ღ( ´・ᴗ・` )~

0
0
0
0

版权声明:本文为 TiDB 社区用户原创文章,遵循 CC BY-NC-SA 4.0 版权协议,转载请附上原文出处链接和本声明。

评论
暂无评论