フィルタリング
リレーショナル データベースである TiDB は、正確なクエリを実行するためのSQL演算子なフィルタリング条件と柔軟な組み合わせをサポートします。
概要
スカラーフィールドとJSONフィールドの両方でフィルタリングできます。JSONフィールドでのフィルタリングは、ベクター検索のメタデータフィルタリングでよく使用されます。
pytidbは、開発者が AI アプリケーションを効率的に構築できるように設計されています。
pytidb使用する場合、 table.query() 、 table.delete() 、 table.update() 、およびtable.search()メソッドにfiltersパラメータを渡すことでフィルタリングを適用できます。
フィルターパラメータは、 辞書フィルターとSQL文字列フィルター 2 つの形式をサポートします。
辞書フィルター
pytidbでは、フィルターパラメータとして演算子を含む Python 辞書を使用して、フィルター条件を定義できます。
フィルターの辞書構造は次のとおりです。
{
"<key>": {
"<operator>": <value>
},
...
}
<key>: キーは、列名、JSON フィールドにアクセスするための JSON パス式 ( メタデータフィルタリング参照)、または論理演算子になります。<operator>: 演算子は比較演算子または包含演算子になります。<value>: 値は演算子に応じてスカラー値または配列になります。
例: created_atが 2024-01-01 より大きいレコードをフィルタリングする
table.query({
# The `created_at` is a scalar field with DATETIME type
"created_at": {
"$gt": "2024-01-01"
}
})
例: meta.categoryが配列 ["tech", "science"] に含まれるレコードをフィルタリングする
results = (
table.search("some query", search_type="vector")
.filter({
# The `meta` is a JSON field, and its value is a JSON object like {"category": "tech"}
"meta.category": {
"$in": ["tech", "science"]
}
})
.limit(10)
.to_list()
)
比較演算子
次の比較演算子を使用してレコードをフィルタリングできます。
例: user_id 1に等しいレコードをフィルタリングする
{
"user_id": {
"$eq": 1
}
}
$eq演算子は省略可能です。次のフィルタは前のフィルタと同等です。
{
"user_id": 1
}
包含演算子
次の包含演算子を使用してレコードをフィルタリングできます。
例: categoryが配列 ["tech", "science"] に含まれるレコードをフィルタリングする
{
"category": {
"$in": ["tech", "science"]
}
}
論理演算子
論理演算子$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()
AND 、 OR 、括弧を使用して複数の条件を組み合わせたり、TiDB でサポートされているSQL演算子使用したりできます。