フィルタリング
リレーショナル データベースである 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()
)
比較演算子
次の比較演算子を使用してレコードをフィルタリングできます。
| オペレーター | 説明 |
|---|---|
$eq | 等しい値 |
$ne | 値と等しくない |
$gt | 値より大きい |
$gte | 値以上 |
$lt | 値より小さい |
$lte | 値以下 |
例: user_id 1に等しいレコードをフィルタリングする
{
"user_id": {
"$eq": 1
}
}
$eq演算子は省略可能です。次のフィルタは前のフィルタと同等です。
{
"user_id": 1
}
包含演算子
次の包含演算子を使用してレコードをフィルタリングできます。
| オペレーター | 説明 |
|---|---|
$in | 配列(文字列、整数、または浮動小数点数) |
$nin | 配列内にありません(文字列、整数、浮動小数点数) |
例: 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()
AND 、 OR 、括弧を使用して複数の条件を組み合わせたり、TiDB でサポートされているSQL演算子使用したりできます。