📣
TiDB Cloud Essential 开放公测中。此页面由 AI 自动翻译,英文原文请见此处。

过滤



作为一款关系型数据库,TiDB 支持丰富的 SQL 运算符 以及灵活组合的过滤条件,用于实现精确查询。

概述

你可以对标量字段和 JSON 字段进行过滤。对 JSON 字段的过滤通常用于向量搜索中的 元信息过滤

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

在使用 pytidb 时,你可以通过将 filters 参数传递给 table.query()table.delete()table.update()table.search() 方法来实现过滤。

filters 参数支持两种格式:字典过滤器SQL 字符串过滤器

字典过滤器

pytidb 允许你使用带有运算符的 Python 字典来定义过滤条件,并作为 filters 参数传入。

filters 的字典结构如下:

{ "<key>": { "<operator>": <value> }, ... }

示例:过滤 created_at 大于 2024-01-01 的记录

table.query({ # `created_at` 是 DATETIME 类型的标量字段 "created_at": { "$gt": "2024-01-01" } })

示例:过滤 meta.category["tech", "science"] 数组中的记录

results = ( table.search("some query", search_type="vector") .filter({ # `meta` 是 JSON 字段,其值为类似 {"category": "tech"} 的 JSON 对象 "meta.category": { "$in": ["tech", "science"] } }) .limit(10) .to_list() )

比较运算符

你可以使用以下比较运算符来过滤记录:

运算符描述
$eq等于指定值
$ne不等于指定值
$gt大于指定值
$gte大于等于指定值
$lt小于指定值
$lte小于等于指定值

示例:过滤 user_id 等于 1 的记录

{ "user_id": { "$eq": 1 } }

你可以省略 $eq 运算符。以下过滤条件与上例等价:

{ "user_id": 1 }

包含运算符

你可以使用以下包含运算符来过滤记录:

运算符描述
$in在数组中(string、整数型或 float)
$nin不在数组中(string、整数型、float)

示例:过滤 category["tech", "science"] 数组中的记录

{ "category": { "$in": ["tech", "science"] } }

逻辑运算符

你可以使用逻辑运算符 $and$or 组合多个过滤条件。

运算符描述
$and返回同时满足列表中所有过滤条件的结果
$or返回满足列表中任意过滤条件的结果

$and$or 的语法:

{ "$and|$or": [ { "field_name": { <operator>: <value> } }, { "field_name": { <operator>: <value> } } ... ] }

示例:使用 $and 组合多个过滤条件:

{ "$and": [ { "created_at": { "$gt": "2024-01-01" } }, { "meta.category": { "$in": ["tech", "science"] } } ] }

SQL 字符串过滤器

你也可以将 SQL 字符串作为 filters 使用。该字符串必须是符合 TiDB SQL 语法的有效 SQL WHERE 子句(不包含 WHERE 关键字)。

示例:过滤 created_at 大于 2024-01-01 的记录

results = table.query( filters="created_at > '2024-01-01'", limit=10 ).to_list()

示例:过滤 JSON 字段 meta.category 等于 'tech' 的记录

results = table.query( filters="meta->>'$.category' = 'tech'", limit=10 ).to_list()

你可以使用 ANDOR 和括号组合多个条件,并使用任何 TiDB 支持的 SQL 运算符

文档内容是否有帮助?