フィルタリングの概要
Zilliz Cloud は、データを正確にクエリできる強力なフィルタリング機能を提供します。フィルター式を使用すると、フィールド値に基づいてエンティティを選択し、さまざまな条件で検索結果を絞り込めます。このガイドでは、Zilliz Cloud クラスターでフィルター式を使用する方法を、クエリ操作に焦点を当てた例を交えて説明します。これらのフィルターは、検索リクエストと削除リクエストにも適用できます。
基本演算子
Zilliz Cloud は、データのフィルタリングに使用できるいくつかの基本演算子をサポートしています。
-
比較演算子:
==、!=、>、<、>=、<=を使用すると、数値フィールドまたはテキストフィールドに基づいてフィルタリングできます。 -
範囲フィルターとパターンフィルター:
IN、LIKE、=~、!~は、値、ワイルドカードパターン、または正規表現パターンに一致します。文字列パターンの詳細は、Pattern Matching を参照してください。 -
算術演算子:
+、-、*、/、%、**は、数値フィールドを使用する計算に使用します。 -
ビット演算子: 以降では、
&、|、^を使用して、権限やステータスビットなど複数のフラグをエンコードした整数フィールドをフィルタリングできます。詳細は、Basic Operators を参照してください。 -
論理演算子:
AND、OR、NOTは、複数の条件を組み合わせて複雑な式を作成します。 -
IS NULL 演算子と IS NOT NULL 演算子:
IS NULLを使用すると、フィールド値が NULL のエンティティを選択でき、IS NOT NULLを使用すると、フィールド値が NULL でないエンティティを選択できます。これらの演算子はスカラーフィールドをサポートしています。サポートされている型、構文、例については、IS NULL and IS NOT NULL operators を参照してください。
例: 色によるフィルタリング
スカラーフィールド color で原色(赤、緑、または青)を持つエンティティを検索するには、次のフィルター式を使用します。
- Python
- Java
- Go
- Rust
- C++
- NodeJS
- CSharp
- cURL
filter='color in ["red", "green", "blue"]'
String filter = "color in [\"red\", \"green\", \"blue\"]";
filter := "color in [\"red\", \"green\", \"blue\"]"
let filter = "color in [\"red\", \"green\", \"blue\"]";
std::string filter = "color in [\"red\", \"green\", \"blue\"]";
const filter = 'color in ["red", "green", "blue"]';
string filter = "color in [\"red\", \"green\", \"blue\"]";
filter='color in ["red", "green", "blue"]'
例: 権限ビットによるフィルタリング
整数の permissions フィールドで SHARE ビットが設定されているエンティティを検索するには、ビット AND 演算子(&)を使用します。
- Python
- Java
- Go
- Rust
- C++
- NodeJS
- CSharp
- cURL
filter='(permissions & 4) == 4'
String filter = "(permissions & 4) == 4";
filter := "(permissions & 4) == 4"
let filter = "(permissions & 4) == 4";
std::string filter = "(permissions & 4) == 4";
const filter = '(permissions & 4) == 4';
string filter = "(permissions & 4) == 4";
filter='(permissions & 4) == 4'
例: 正規表現パターンによるフィルタリング
message フィールドに E1001 などのエラーコードが含まれるエンティティを検索するには、正規表現一致演算子 =~ を使用します。
- Python
- Java
- Go
- Rust
- C++
- NodeJS
- CSharp
- cURL
filter='message =~ "E[0-9]{4}"'
String filter = "message =~ \"E[0-9]{4}\"";
filter := "message =~ \"E[0-9]{4}\""
let filter = "message =~ \"E[0-9]{4}\"";
std::string filter = "message =~ \"E[0-9]{4}\"";
const filter = 'message =~ "E[0-9]{4}"';
string filter = "message =~ \"E[0-9]{4}\"";
filter='message =~ "E[0-9]{4}"'
正規表現フィルターは部分文字列の一致を使用します。フィールド値全体がパターンに一致する必要がある場合は、^ アンカーと $ アンカーを追加します。詳細は、Pattern Matching を参照してください。
例: JSON フィールドのフィルタリング
Zilliz Cloud では、JSON フィールド内のキーを参照できます。たとえば、price キーと model キーを持つ JSON フィールド product があり、特定のモデルで価格が 1,850 未満の製品を検索する場合は、次のフィルター式を使用します。
- Python
- Java
- Go
- Rust
- C++
- NodeJS
- CSharp
- cURL
filter='product["model"] == "JSN-087" AND product["price"] < 1850'
String filter = "product[\"model\"] == \"JSN-087\" AND product[\"price\"] < 1850";
filter := "product[\"model\"] == \"JSN-087\" AND product[\"price\"] < 1850"
let filter = "product[\"model\"] == \"JSN-087\" AND product[\"price\"] < 1850";
std::string filter = "product[\"model\"] == \"JSN-087\" AND product[\"price\"] < 1850";
const filter = 'product["model"] == "JSN-087" AND product["price"] < 1850';
string filter = "product[\"model\"] == \"JSN-087\" AND product[\"price\"] < 1850";
filter='product["model"] == "JSN-087" AND product["price"] < 1850'
例: 配列フィールドのフィルタリング
2000 年以降に観測所が報告した平均気温の記録を含む配列フィールド history_temperatures があり、2009 年の気温(10 番目の記録)が 23°C を超える観測所を検索する場合は、次の式を使用します。
- Python
- Java
- Go
- Rust
- C++
- NodeJS
- CSharp
- cURL
filter='history_temperatures[10] > 23'
String filter = "history_temperatures[10] > 23";
filter := "history_temperatures[10] > 23"
let filter = "history_temperatures[10] > 23";
std::string filter = "history_temperatures[10] > 23";
const filter = 'history_temperatures[10] > 23';
string filter = "history_temperatures[10] > 23";
filter='history_temperatures[10] > 23'
これらの基本演算子の詳細は、Basic Operators を参照してください。
フィルター式テンプレート
CJK 文字を使用してフィルタリングすると、文字セットが大きくエンコーディングも異なるため、処理がより複雑になる場合があります。その結果、特に IN 演算子を使用すると、パフォーマンスが低下する可能性があります。
Zilliz Cloud は、CJK 文字を扱う際のパフォーマンスを最適化するために、フィルター式テンプレートを導入しています。動的な値をフィルター式から分離することで、クエリエンジンはパラメーターの挿入をより効率的に処理します。
年齢が 25 を超え、"北京"(北京)または "上海"(上海)に住む個人を検索するには、次のテンプレート式を使用します。
- Python
- Java
- Go
- Rust
- C++
- NodeJS
- CSharp
- cURL
filter = "age > 25 AND city IN ['北京', '上海']"
String filter = "age > 25 AND city IN ['北京', '上海']";
filter := "age > 25 AND city IN ['北京', '上海']"
let filter = "age > 25 AND city IN ['北京', '上海']";
std::string filter = "age > 25 AND city IN ['北京', '上海']";
const filter = "age > 25 AND city IN ['北京', '上海']";
string filter = "age > 25 AND city IN ['北京', '上海']";
filter="age > 25 AND city IN ['北京', '上海']"
パフォーマンスを向上させるには、パラメーターを使用する次のバリエーションを使用します。
- Python
- Java
- Go
- Rust
- C++
- NodeJS
- CSharp
- cURL
filter = "age > {age} AND city in {city}"
filter_params = {"age": 25, "city": ["北京", "上海"]}
import java.util.*;
String filter = "age > {age} AND city in {city}";
Map<String, Object> filterTemplateValues = new HashMap<>();
filterTemplateValues.put("age", 25);
filterTemplateValues.put("city", Arrays.asList("北京", "上海"));
filter := "age > {age} AND city in {city}"
filterTemplates := map[string]any{
"age": 25,
"city": []string{"北京", "上海"},
}
use milvus::v2::prelude::*;
use std::collections::HashMap;
let filter = "age > {age} AND city in {city}";
let filter_templates: HashMap<String, FilterTemplateValue> = HashMap::from([
("age".into(), FilterTemplateValue::Int64(25)),
("city".into(), FilterTemplateValue::StringArray(vec!["北京".to_string(), "上海".to_string()])),
]);
std::string filter = "age > {age} AND city in {city}";
std::unordered_map<std::string, nlohmann::json> filterTemplates = {
{"age", 25},
{"city", nlohmann::json::array({"北京", "上海"})}
};
const filter = "age > {age} AND city in {city}";
const exprValues = { age: 25, city: ["北京", "上海"] };
using System.Collections.Generic;
string filter = "age > {age} AND city in {city}";
var filterTemplateValues = new Dictionary<string, object>
{
["age"] = 25,
["city"] = new[] { "北京", "上海" }
};
filter="age > {age} AND city in {city}"
filter_params='{"age": 25, "city": ["北京", "上海"]}'
この方法では、解析のオーバーヘッドが減少し、クエリ速度が向上します。詳細は、Filter Templating を参照してください。
データ型固有の演算子
Zilliz Cloud は、JSON、ARRAY、VARCHAR フィールドなど、特定のデータ型向けの高度なフィルタリング演算子を提供します。
JSON フィールド固有の演算子
Zilliz Cloud は JSON フィールドをクエリするための高度な演算子を提供し、複雑な JSON 構造内での正確なフィルタリングを可能にします。
JSON_CONTAINS(identifier, jsonExpr): フィールド内に JSON 式が存在するかどうかを確認します。
- Python
- Java
- Go
- Rust
- C++
- NodeJS
- CSharp
- cURL
# JSON data: {"tags": ["electronics", "sale", "new"]}
filter='json_contains(tags, "sale")'
// JSON data: {"tags": ["electronics", "sale", "new"]}
String filter = "json_contains(tags, \"sale\")";
// JSON data: {"tags": ["electronics", "sale", "new"]}
filter := "json_contains(tags, \"sale\")"
// JSON data: {"tags": ["electronics", "sale", "new"]}
let filter = "json_contains(tags, \"sale\")";
// JSON data: {"tags": ["electronics", "sale", "new"]}
std::string filter = "json_contains(tags, \"sale\")";
// JSON data: {"tags": ["electronics", "sale", "new"]}
const filter = 'json_contains(tags, "sale")';
// JSON data: {"tags": ["electronics", "sale", "new"]}
string filter = "json_contains(tags, \"sale\")";
# JSON data: {"tags": ["electronics", "sale", "new"]}
filter='json_contains(tags, "sale")'
JSON_CONTAINS_ALL(identifier, jsonExpr): JSON 式のすべての要素が存在することを確認します。
- Python
- Java
- Go
- Rust
- C++
- NodeJS
- CSharp
- cURL
# JSON data: {"tags": ["electronics", "sale", "new", "discount"]}
filter='json_contains_all(tags, ["electronics", "sale", "new"])'
// JSON data: {"tags": ["electronics", "sale", "new", "discount"]}
String filter = "json_contains_all(tags, [\"electronics\", \"sale\", \"new\"])";
// JSON data: {"tags": ["electronics", "sale", "new", "discount"]}
filter := "json_contains_all(tags, [\"electronics\", \"sale\", \"new\"])"
// JSON data: {"tags": ["electronics", "sale", "new", "discount"]}
let filter = "json_contains_all(tags, [\"electronics\", \"sale\", \"new\"])";
// JSON data: {"tags": ["electronics", "sale", "new", "discount"]}
std::string filter = "json_contains_all(tags, [\"electronics\", \"sale\", \"new\"])";
// JSON data: {"tags": ["electronics", "sale", "new", "discount"]}
const filter = 'json_contains_all(tags, ["electronics", "sale", "new"])';
// JSON data: {"tags": ["electronics", "sale", "new", "discount"]}
string filter = "json_contains_all(tags, [\"electronics\", \"sale\", \"new\"])";
# JSON data: {"tags": ["electronics", "sale", "new", "discount"]}
filter='json_contains_all(tags, ["electronics", "sale", "new"])'
JSON_CONTAINS_ANY(identifier, jsonExpr): JSON 式内の少なくとも 1 つの要素が存在するエンティティをフィルタリングします。
- Python
- Java
- Go
- Rust
- C++
- NodeJS
- CSharp
- cURL
# JSON data: {"tags": ["electronics", "sale", "new"]}
filter='json_contains_any(tags, ["electronics", "new", "clearance"])'
// JSON data: {"tags": ["electronics", "sale", "new"]}
String filter = "json_contains_any(tags, [\"electronics\", \"new\", \"clearance\"])";
// JSON data: {"tags": ["electronics", "sale", "new"]}
filter := "json_contains_any(tags, [\"electronics\", \"new\", \"clearance\"])"
// JSON data: {"tags": ["electronics", "sale", "new"]}
let filter = "json_contains_any(tags, [\"electronics\", \"new\", \"clearance\"])";
// JSON data: {"tags": ["electronics", "sale", "new"]}
std::string filter = "json_contains_any(tags, [\"electronics\", \"new\", \"clearance\"])";
// JSON data: {"tags": ["electronics", "sale", "new"]}
const filter = 'json_contains_any(tags, ["electronics", "new", "clearance"])';
// JSON data: {"tags": ["electronics", "sale", "new"]}
string filter = "json_contains_any(tags, [\"electronics\", \"new\", \"clearance\"])";
# JSON data: {"tags": ["electronics", "sale", "new"]}
filter='json_contains_any(tags, ["electronics", "new", "clearance"])'
JSON 演算子の詳細は、JSON Operators を参照してください。
ARRAY フィールド固有の演算子
Zilliz Cloud は、ARRAY_CONTAINS、ARRAY_CONTAINS_ALL、ARRAY_CONTAINS_ANY、ARRAY_LENGTH など、配列フィールド向けの高度なフィルタリング演算子を提供し、配列データをきめ細かく制御できます。
ARRAY_CONTAINS: 特定の要素を含むエンティティをフィルタリングします。
- Python
- Java
- Go
- Rust
- C++
- NodeJS
- CSharp
- cURL
filter="ARRAY_CONTAINS(history_temperatures, 23)"
String filter = "ARRAY_CONTAINS(history_temperatures, 23)";
filter := "ARRAY_CONTAINS(history_temperatures, 23)"
let filter = "ARRAY_CONTAINS(history_temperatures, 23)";
std::string filter = "ARRAY_CONTAINS(history_temperatures, 23)";
const filter = 'ARRAY_CONTAINS(history_temperatures, 23)';
string filter = "ARRAY_CONTAINS(history_temperatures, 23)";
filter='ARRAY_CONTAINS(history_temperatures, 23)'
ARRAY_CONTAINS_ALL: リスト内のすべての要素が存在するエンティティをフィルタリングします。
- Python
- Java
- Go
- Rust
- C++
- NodeJS
- CSharp
- cURL
filter="ARRAY_CONTAINS_ALL(history_temperatures, [23, 24])"
String filter = "ARRAY_CONTAINS_ALL(history_temperatures, [23, 24])";
filter := "ARRAY_CONTAINS_ALL(history_temperatures, [23, 24])"
let filter = "ARRAY_CONTAINS_ALL(history_temperatures, [23, 24])";
std::string filter = "ARRAY_CONTAINS_ALL(history_temperatures, [23, 24])";
const filter = 'ARRAY_CONTAINS_ALL(history_temperatures, [23, 24])';
string filter = "ARRAY_CONTAINS_ALL(history_temperatures, [23, 24])";
filter='ARRAY_CONTAINS_ALL(history_temperatures, [23, 24])'
ARRAY_CONTAINS_ANY: リスト内のいずれかの要素を含むエンティティをフィルタリングします。
- Python
- Java
- Go
- Rust
- C++
- NodeJS
- CSharp
- cURL
filter="ARRAY_CONTAINS_ANY(history_temperatures, [23, 24])"
String filter = "ARRAY_CONTAINS_ANY(history_temperatures, [23, 24])";
filter := "ARRAY_CONTAINS_ANY(history_temperatures, [23, 24])"
let filter = "ARRAY_CONTAINS_ANY(history_temperatures, [23, 24])";
std::string filter = "ARRAY_CONTAINS_ANY(history_temperatures, [23, 24])";
const filter = 'ARRAY_CONTAINS_ANY(history_temperatures, [23, 24])';
string filter = "ARRAY_CONTAINS_ANY(history_temperatures, [23, 24])";
filter='ARRAY_CONTAINS_ANY(history_temperatures, [23, 24])'
ARRAY_LENGTH: 配列の長さに基づいてフィルタリングします。
- Python
- Java
- Go
- Rust
- C++
- NodeJS
- CSharp
- cURL
filter="ARRAY_LENGTH(history_temperatures) < 10"
String filter = "ARRAY_LENGTH(history_temperatures) < 10";
filter := "ARRAY_LENGTH(history_temperatures) < 10"
let filter = "ARRAY_LENGTH(history_temperatures) < 10";
std::string filter = "ARRAY_LENGTH(history_temperatures) < 10";
const filter = 'ARRAY_LENGTH(history_temperatures) < 10';
string filter = "ARRAY_LENGTH(history_temperatures) < 10";
filter='ARRAY_LENGTH(history_temperatures) < 10'
配列演算子の詳細は、ARRAY Operators を参照してください。
VARCHAR フィールド固有の演算子
Zilliz Cloud は、VARCHAR フィールドで正確なテキスト検索を行うための専用の演算子を提供します。
パターンマッチング演算子
LIKE、=~、!~ 演算子は、VARCHAR フィールド、JSON 文字列パス、特定の ARRAY<VARCHAR> 要素で文字列パターンに一致します。単純なワイルドカードパターンには LIKE を使用します。RE2 正規表現には =~ と !~ を使用します。
詳細は、Pattern Matching を参照してください。
TEXT_MATCH 演算子
TEXT_MATCH 演算子を使用すると、特定のクエリ用語に基づいてドキュメントを正確に取得できます。これは、スカラーフィルターとベクトル類似検索を組み合わせたフィルター検索に特に役立ちます。意味検索とは異なり、Text Match は用語の厳密な出現に焦点を当てます。
Zilliz Cloud は Tantivy を使用して、転置インデックスと用語ベースのテキスト検索をサポートします。プロセスは次のとおりです。
-
アナライザー: 入力テキストをトークン化して処理します。
-
インデックス作成: 一意のトークンをドキュメントにマッピングする転置インデックスを作成します。
詳細は、Text Match を参照してください。
PHRASE_MATCH 演算子
PHRASE_MATCH 演算子を使用すると、クエリ用語の順序と隣接性の両方を考慮して、正確なフレーズ一致に基づくドキュメントの取得が可能になります。
詳細は、Phrase Match を参照してください。