使用 Python 进行全文检索
与关注语义相似度的 向量检索 不同,全文检索允许你通过精确关键词检索文档。在 RAG(检索增强生成)场景中,你可以将全文检索与向量检索结合使用,以提升检索质量。
TiDB 的全文检索功能提供以下能力:
直接查询文本数据:你可以直接检索任意字符串类型的列,无需进行嵌入处理。
多语言支持:无需指定语言即可获得高质量检索。TiDB 支持在同一张表中存储多种语言的文档,并会为每个文档自动选择最佳的文本分析器。
按相关性排序:检索结果可以通过广泛采用的 BM25 排序 算法按相关性排序。
完全兼容 SQL:所有 SQL 功能,如预过滤、后过滤、分组和关联查询等,都可以与全文检索结合使用。
提示:
有关 SQL 用法,参见 使用 SQL 进行全文检索。
如需在 AI 应用中同时使用全文检索和向量检索,参见 混合检索。
前提条件
全文检索目前仍处于早期阶段,我们正在持续向更多用户开放。目前,全文检索仅在以下产品选项和区域可用:
- TiDB Cloud Serverless:
法兰克福 (eu-central-1)
和新加坡 (ap-southeast-1)
要完成本教程,请确保你拥有位于支持区域的 TiDB Cloud Serverless 集群。如果还没有,请按照 创建 TiDB Cloud Serverless 集群 进行创建。
快速开始
步骤 1. 安装 pytidb Python SDK
pytidb 是 TiDB 官方的 Python SDK,旨在帮助开发者高效构建 AI 应用。该 SDK 内置了对向量检索和全文检索的支持。
安装 SDK,请运行以下命令:
pip install pytidb
# (可选)如需使用内置的 embedding 函数和 reranker:
# pip install "pytidb[models]"
# (可选)如需将查询结果转换为 pandas DataFrame:
# pip install pandas
步骤 2. 连接 TiDB
from pytidb import TiDBClient
db = TiDBClient.connect(
host="HOST_HERE",
port=4000,
username="USERNAME_HERE",
password="PASSWORD_HERE",
database="DATABASE_HERE",
)
你可以在 TiDB Cloud 控制台 获取这些连接参数:
进入 Clusters 页面,点击目标集群名称进入集群概览页。
点击右上角的 Connect,会弹出连接对话框,显示连接参数。
例如,连接参数如下所示:
HOST: gateway01.us-east-1.prod.shared.aws.tidbcloud.com PORT: 4000 USERNAME: 4EfqPF23YKBxaQb.root PASSWORD: abcd1234 DATABASE: test CA: /etc/ssl/cert.pem则连接 TiDB Cloud Serverless 集群的 Python 代码如下:
db = TiDBClient.connect( host="gateway01.us-east-1.prod.shared.aws.tidbcloud.com", port=4000, username="4EfqPF23YKBxaQb.root", password="abcd1234", database="test", )注意,上述示例仅用于演示。你需要使用自己的参数,并妥善保管。
步骤 3. 创建表和全文索引
以创建名为 chunks
的表为例,包含以下列:
id
(int):分块的 ID。text
(text):分块的文本内容。user_id
(int):创建该分块的用户 ID。
from pytidb.schema import TableModel, Field
class Chunk(TableModel, table=True):
__tablename__ = "chunks"
id: int = Field(primary_key=True)
text: str = Field()
user_id: int = Field()
table = db.create_table(schema=Chunk)
if not table.has_fts_index("text"):
table.create_fts_index("text") # 👈 在 text 列上创建全文索引。
步骤 4. 插入数据
table.bulk_insert(
[
Chunk(id=2, text="the quick brown", user_id=2),
Chunk(id=3, text="fox jumps", user_id=3),
Chunk(id=4, text="over the lazy dog", user_id=4),
]
)
步骤 5. 执行全文检索
插入数据后,你可以按如下方式进行全文检索:
df = (
table.search("brown fox", search_type="fulltext")
.limit(2)
.to_pandas() # optional
)
# id text user_id
# 0 3 fox jumps 3
# 1 2 the quick brown 2
完整示例参见 pytidb full-text search demo。
相关链接
反馈与帮助
全文检索目前仍处于早期阶段,开放范围有限。如果你希望在尚未开放的区域体验全文检索,或有任何反馈或需要帮助,欢迎联系我们: