メインコンテンツまでスキップ

TIMESTAMPTZ フィールド

eコマースシステム、コラボレーションツール、分散ログなど、地域をまたいで時刻を追跡するアプリケーションでは、タイムゾーン付きのタイムスタンプを正確に扱う必要があります。Zilliz Cloud の TIMESTAMPTZ データ型は、タイムスタンプを関連するタイムゾーンとあわせて格納することで、この機能を提供します。

TIMESTAMPTZ フィールドとは​

TIMESTAMPTZ フィールドは、Zilliz Cloud のスキーマで定義されるデータ型(DataType.TIMESTAMPTZ)であり、タイムゾーンを考慮した入力を受け付け、すべての時点を内部的に UTC の絶対時刻として格納します。

  • 受け入れ可能な入力形式: TIMESTAMPTZ フィールドは、ISO 8601 互換のタイムスタンプ文字列を受け付けます。例を以下に示します。

    • "2024-12-31 22:00:00"

    • "2024-12-31T22:00:00"

    • "2024-12-31T22:00:00+08:00"

    • "2024-12-31T22:00:00Z"

  • タイムスタンプの解析ルール: タイムスタンプの解釈方法は、入力文字列でタイムゾーンが明示的に指定されているかどうかによって異なります。

    • 入力にタイムゾーンオフセット(たとえば +08:00 や Z)が含まれている場合、その入力は絶対的な時点として扱われます。

    • 入力にタイムゾーンオフセットが含まれていない場合は、コレクションに設定されたタイムゾーンに基づいて解釈されます。たとえば、コレクションのタイムゾーンが Asia/Shanghai: の場合、次のとおりです。

      • "2024-12-31 22:00:00" は 2024-12-31T22:00:00+08:00 として解釈されます。

      • "2024-12-31T22:00:00" は 2024-12-31T22:00:00Z として解釈され、これは 2025-01-01T06:00:00+08:00 に相当します。

  • 内部保存: すべての TIMESTAMPTZ 値は正規化され、協定世界時(UTC)として格納されます。

  • 比較とフィルタリング: TIMESTAMPTZ フィールドに対するすべての比較、フィルタリング、並べ替え操作は、UTC に正規化された値に対して実行されるため、異なるタイムゾーン間でも一貫した動作が保証されます。

Notes
  • TIMESTAMPTZ フィールドには nullable=True を設定して、値の欠損を許可できます。

  • default_value 属性を使用すると、ISO 8601 形式でデフォルトのタイムスタンプ値を指定できます。

詳細は、Nullable & Default を参照してください。

基本的な操作​

TIMESTAMPTZ フィールドを使用する基本的なワークフローは、Zilliz Cloud の他のスカラーフィールドと同じです。フィールドの定義 → データの挿入 → クエリ/filter. という流れになります。

ステップ 1: TIMESTAMPTZ フィールドを定義する​

TIMESTAMPTZ フィールドを使用するには、コレクションの作成時にコレクションスキーマで明示的に定義します。次の例では、DataType.TIMESTAMPTZ 型の tsz フィールドを持つコレクションを作成する方法を示します。

python
import time
from pymilvus import MilvusClient, DataType
import datetime
import pytz

server_address = "YOUR_CLUSTER_ENDPOINT"
collection_name = "timestamptz_test123"

client = MilvusClient(uri=server_address)

if client.has_collection(collection_name):
client.drop_collection(collection_name)

schema = client.create_schema()
# Add a primary key field
schema.add_field("id", DataType.INT64, is_primary=True)
# Add a TIMESTAMPTZ field that allows null values
schema.add_field("tsz", DataType.TIMESTAMPTZ, nullable=True)
# Add a vector field
schema.add_field("vec", DataType.FLOAT_VECTOR, dim=4)

client.create_collection(collection_name, schema=schema, consistency_level="Session")
print(f"Collection '{collection_name}' with a TimestampTz field created successfully.")

ステップ 2: データを挿入する​

タイムゾーンオフセットを含む ISO 8601 文字列を持つエンティティを挿入します。

次の例では、コレクションに 8,193 行のサンプルデータを挿入します。各行には次のものが含まれます。

  • 一意の ID

  • タイムゾーンを考慮したタイムスタンプ(上海時間)

  • シンプルな 4 次元ベクトル

python
data_size = 10

# Get the Asia/Shanghai time zone using the pytz library
# You can use any valid IANA time zone identifier such as:
# "Asia/Tokyo", "America/New_York", "Europe/London", "UTC", etc.
# To view all available values:
# import pytz; print(pytz.all_timezones)
# Reference:
# IANA database – https://www.iana.org/time-zones
# Wikipedia – https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
shanghai_tz = pytz.timezone("Asia/Shanghai")

data = [
{
"id": i + 1,
"tsz": shanghai_tz.localize(
datetime.datetime(2025, 1, 1, 0, 0, 0) + datetime.timedelta(days=i)
).isoformat(),
"vec": [float(i) / 10 for _ in range(4)],
}
for i in range(data_size)
]

client.insert(collection_name, data)
print("Data inserted successfully.")

ステップ 3: フィルタリング操作​

TIMESTAMPTZ は、スカラー比較、インターバル演算、および時間コンポーネントの抽出をサポートしています。

TIMESTAMPTZ フィールドに対してフィルタリング操作を実行する前に、次の条件を満たしていることを確認してください。

  • 各ベクトルフィールドにインデックスを作成していること。

  • コレクションがメモリにロードされていること。

サンプルコードを表示
python
# Create index on vector field
index_params = client.prepare_index_params()
index_params.add_index(
field_name="vec",
index_type="AUTOINDEX",
index_name="vec_index",
metric_type="COSINE"
)
client.create_index(collection_name, index_params)
print("Index created successfully.")

# Load the collection
client.load_collection(collection_name)
print(f"Collection '{collection_name}' loaded successfully.")

タイムスタンプフィルタリングを使用したクエリ​

==、!=、<、>、<=、>= などの算術演算子を使用します。Zilliz Cloud で使用可能な算術演算子の完全なリストについては、Arithmetic Operators を参照してください。

Notes

連結した範囲式(たとえば lower_bound < tsz < upper_bound)はサポートされていません。

代わりに論理積を使用してください:tsz > lower_bound AND tsz < upper_bound。

次の例では、タイムスタンプ(tsz)が 2025-01-03T00:00:00+08:00 と等しくないエンティティをフィルタリングします。

python
# Query for entities where tsz is not equal to '2025-01-03T00:00:00+08:00'
expr = "tsz != ISO '2025-01-03T00:00:00+08:00'"

results = client.query(
collection_name=collection_name,
filter=expr,
output_fields=["id", "tsz"],
limit=10
)

print("Query result: ", results)

# Expected output:
# Query result: data: ["{'id': 1, 'tsz': '2024-12-31T16:00:00Z'}", "{'id': 2, 'tsz': '2025-01-01T16:00:00Z'}", "{'id': 4, 'tsz': '2025-01-03T16:00:00Z'}", "{'id': 5, 'tsz': '2025-01-04T16:00:00Z'}", "{'id': 6, 'tsz': '2025-01-05T16:00:00Z'}", "{'id': 7, 'tsz': '2025-01-06T16:00:00Z'}", "{'id': 8, 'tsz': '2025-01-07T16:00:00Z'}", "{'id': 9, 'tsz': '2025-01-08T16:00:00Z'}", "{'id': 10, 'tsz': '2025-01-09T16:00:00Z'}"]

上記の例では、

  • tsz は、スキーマで定義された TIMESTAMPTZ フィールドの名前です。

  • ISO '2025-01-03T00:00:00+08:00' は、タイムゾーンオフセットを含む ISO 8601 形式のタイムスタンプリテラルです。

  • != は、フィールド値とそのリテラルを比較します。他にサポートされている演算子には、==、<、<=、>、>= があります。

インターバル演算​

ISO 8601 の期間形式の INTERVAL 値を使用して、TIMESTAMPTZ フィールドに対する算術演算を実行できます。これにより、データをフィルタリングする際に、タイムスタンプに対して日、時間、分などの期間を加算または減算できます。

たとえば、次のクエリは、タイムスタンプ(tsz)に 0 日を加算した値が 2025-01-03T00:00:00+08:00 と 等しくない エンティティをフィルタリングします。

python
expr = "tsz + INTERVAL 'P0D' != ISO '2025-01-03T00:00:00+08:00'"

results = client.query(
collection_name,
filter=expr,
output_fields=["id", "tsz"],
limit=10
)

print("Query result: ", results)

# Expected output:
# Query result: data: ["{'id': 1, 'tsz': '2024-12-31T16:00:00Z'}", "{'id': 2, 'tsz': '2025-01-01T16:00:00Z'}", "{'id': 4, 'tsz': '2025-01-03T16:00:00Z'}", "{'id': 5, 'tsz': '2025-01-04T16:00:00Z'}", "{'id': 6, 'tsz': '2025-01-05T16:00:00Z'}", "{'id': 7, 'tsz': '2025-01-06T16:00:00Z'}", "{'id': 8, 'tsz': '2025-01-07T16:00:00Z'}", "{'id': 9, 'tsz': '2025-01-08T16:00:00Z'}", "{'id': 10, 'tsz': '2025-01-09T16:00:00Z'}"]
Notes

INTERVAL 値は ISO 8601 の期間構文に従います。例を以下に示します。

  • P1D → 1 日

  • PT3H → 3 時間

  • P2DT6H → 2 日と 6 時間

INTERVAL の算術演算は、次のようにフィルター式で直接使用できます。

  • tsz + INTERVAL 'P3D' → 3 日を加算します

  • tsz - INTERVAL 'PT2H' → 2 時間を減算します

タイムスタンプフィルタリングを使用した検索​

TIMESTAMPTZ によるフィルタリングとベクトル類似検索を組み合わせることで、時間と類似度の両方の基準で結果を絞り込むことができます。

python
# Define a time-based filter expression
filter = "tsz > ISO '2025-01-05T00:00:00+08:00'"

res = client.search(
collection_name=collection_name, # Collection name
data=[[0.1, 0.2, 0.3, 0.4]], # Query vector (must match collection's vector dim)
limit=5, # Max. number of results to return
filter=filter, # Filter expression using TIMESTAMPTZ
output_fields=["id", "tsz"], # Fields to include in the search results
)

print("Search result: ", res)

# Expected output:
# Search result: data: [[{'id': 6, 'distance': 0.9128709435462952, 'entity': {'tsz': '2025-01-05T16:00:00Z', 'id': 6}}, {'id': 7, 'distance': 0.9128709435462952, 'entity': {'tsz': '2025-01-06T16:00:00Z', 'id': 7}}, {'id': 8, 'distance': 0.9128709435462952, 'entity': {'tsz': '2025-01-07T16:00:00Z', 'id': 8}}, {'id': 10, 'distance': 0.9128709435462952, 'entity': {'tsz': '2025-01-09T16:00:00Z', 'id': 10}}, {'id': 9, 'distance': 0.9128708839416504, 'entity': {'tsz': '2025-01-08T16:00:00Z', 'id': 9}}]]
Notes

コレクションに 2 つ以上のベクトルフィールドがある場合は、タイムスタンプフィルタリングを使用したハイブリッド検索を実行できます。詳細は、マルチベクトルハイブリッド検索 を参照してください。

高度な使用方法​

高度な使用方法として、タイムゾーンをさまざまなレベル(データベース、コレクション、クエリなど)で管理したり、インデックスを使用して TIMESTAMPTZ フィールドに対するクエリを高速化したりできます。

さまざまなレベルでタイムゾーンを管理する​

TIMESTAMPTZ フィールドのタイムゾーンは、コレクション レベルまたは クエリ/search レベルで制御できます。

レベルパラメータースコープ優先度
コレクションtimezoneそのコレクションのデータベース既定のタイムゾーン設定を上書きします。中
クエリ/search/hybrid searchtimezone特定の 1 つの操作に対して一時的に上書きします。最高

手順とコードサンプルについては、それぞれの専用ページを参照してください。

クエリを高速化する​

デフォルトでは、インデックスのない TIMESTAMPTZ フィールドに対するクエリはすべての行をフルスキャンするため、大規模なデータセットでは遅くなる可能性があります。タイムスタンプクエリを高速化するには、TIMESTAMPTZ フィールドに AUTOINDEX インデックスを作成します。

詳細は、STL_SORT を参照してください。