TIMESTAMPTZ 領域Compatible with Milvus 2.6.6+

跨區域追蹤時間的應用程式,例如電子商務系統、協作工具或分散式日誌,需要精確處理帶有時區的時間戳。Milvus 中的TIMESTAMPTZ 資料類型透過儲存帶有相關時區的時間戳來提供此功能。

什麼是 TIMESTAMPTZ 欄位?

TIMESTAMPTZ 欄位是 Milvus 中一個模式定義的資料類型 (DataType.TIMESTAMPTZ) ,它處理時區感應輸入,並在內部將所有時間點儲存為 UTC 絕對時間:

  • 接受的輸入格式:帶有時區偏移的ISO 8601字串(例如,"2025-05-01T23:59:59+08:00" 表示 2025 年 5 月 1 日晚上 11:59:59 (UTC+08:00))。

  • 內部儲存:所有TIMESTAMPTZ 值均以統一時間 (Coordinated Universal Time, UTC) 標準化和儲存。

  • 比較與篩選:所有篩選和排序作業都以 UTC 執行,確保不同時區的結果一致且可預測。

  • 您可以為TIMESTAMPTZ 欄位設定nullable=True ,以允許缺失值。

  • 您可以使用default_value 屬性以ISO 8601格式指定預設時間戳值。

詳情請參閱Nullable & Default

基本操作

使用TIMESTAMPTZ 欄位的基本工作流程與 Milvus 中的其他標量欄位相同:定義欄位 → 插入資料 → 查詢/篩選。

步驟 1:定義 TIMESTAMPTZ 欄位

要使用TIMESTAMPTZ 欄位,請在建立集合時,在集合模式中明確定義。以下範例示範如何建立一個具有tsz 欄位類型DataType.TIMESTAMPTZ 的集合。

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

server_address = "http://localhost:19530"
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.")
// java
// nodejs
// go
# restful

步驟 2:插入資料

插入包含 ISO 8601 字串與時區偏移的實體。

下面的範例會插入 8,193 行樣本資料到集合中。每一行包括

  • 一個唯一的 ID

  • 感知時區的時間戳 (上海時間)

  • 一個簡單的 4 維向量

data_size = 8193

# 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 i in range(4)],
    }
    for i in range(data_size)
]

client.insert(collection_name, data)
print("Data inserted successfully.")
// java
// nodejs
// go
# restful

步驟 3:篩選操作

TIMESTAMPTZ...支援標量比較、區間運算和提取時間元件。

在對TIMESTAMPTZ 欄位執行篩選操作之前,請確定

  • 您已為每個向量欄位建立索引。

  • 集合已載入記憶體。

顯示範例程式碼

# 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.")
// java
// nodejs
// go
# restful

使用時間戳過濾查詢

使用算術運算符如==,!=,<,>,<=,>= 。如需 Milvus 中可用的算術運算符的完整清單,請參閱算術運算符

以下範例過濾時間戳 (tsz) 不等於2025-01-03T00:00:00+08:00 的實體:

# 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'}", "{'id': 11, 'tsz': '2025-01-10T16:00:00Z'}"]
// java
// nodejs
// go
# restful

在上面的範例中

  • tsz 是模式中定義的TIMESTAMPTZ 欄位名稱。

  • ISO '2025-01-03T00:00:00+08:00'ISO 8601格式的時間戳文字,包括其時區偏移。

  • != 將字段值與字面意義比較。其他支援的操作符包括==,<,<=,>, 和>=

間隔運算

您可以使用ISO 8601 長度格式中的INTERVAL值對TIMESTAMPTZ 欄位執行算術運算。這可讓您在篩選資料時,從時間戳記中加入或減去持續時間,例如天、小時或分鐘。

例如,以下查詢會篩選時間戳記 (tsz) 加上零天不等2025-01-03T00:00:00+08:00 的實體:

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'}", "{'id': 11, 'tsz': '2025-01-10T16:00:00Z'}"]
// java
// nodejs
// go
# restful

INTERVAL 值遵循ISO 8601 期限語法。例如

  • P1D → 1 天

  • PT3H → 3 小時

  • P2DT6H → 2 天 6 小時

您可以在篩選表達式中直接使用INTERVAL 算術,例如

  • tsz + INTERVAL 'P3D' → 增加 3 天

  • tsz - INTERVAL 'PT2H' → 減去 2 小時

使用時間戳過濾搜尋

您可以將TIMESTAMPTZ 過濾與向量相似性搜尋結合,以時間和相似性兩種方式縮小搜尋結果的範圍。

# 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': 10, 'distance': 0.9759000539779663, 'entity': {'tsz': '2025-01-09T16:00:00Z', 'id': 10}}, {'id': 9, 'distance': 0.9759000539779663, 'entity': {'tsz': '2025-01-08T16:00:00Z', 'id': 9}}, {'id': 8, 'distance': 0.9759000539779663, 'entity': {'tsz': '2025-01-07T16:00:00Z', 'id': 8}}, {'id': 7, 'distance': 0.9759000539779663, 'entity': {'tsz': '2025-01-06T16:00:00Z', 'id': 7}}, {'id': 6, 'distance': 0.9759000539779663, 'entity': {'tsz': '2025-01-05T16:00:00Z', 'id': 6}}]]
// java
// nodejs
// go
# restful

如果您的集合有兩個或更多向量欄位,您可以使用時間戳過濾執行混合搜尋作業。如需詳細資訊,請參閱多向量混合搜尋

進階用法

對於進階用法,您可以在不同層級 (例如資料庫、集合或查詢) 管理時區,或使用索引加速對TIMESTAMPTZ 欄位的查詢。

管理不同層級的時區

您可以在資料庫資料集查詢/搜尋層級控制TIMESTAMPTZ 欄位的時區。

層級

參數

範圍

優先順序

資料庫

timezone

資料庫中所有收藏集的預設值

最低

收藏集

timezone

覆寫該收藏集的資料庫預設時區設定

查詢/搜尋/混合搜尋

timezone

針對一個特定作業的臨時覆寫

最高

如需逐步說明和程式碼範例,請參閱專用頁面:

加速查詢

預設情況下,在沒有索引的TIMESTAMPTZ 欄位上進行查詢時,會對所有行執行完整掃描,這在大型資料集上可能會很慢。若要加速時間戳查詢,請在TIMESTAMPTZ 欄位上建立STL_SORT 索引。

詳情請參閱STL_SORT