Campo TIMESTAMPTZCompatible with Milvus 2.6.6+

As aplicações que monitorizam o tempo em várias regiões, tais como sistemas de comércio eletrónico, ferramentas de colaboração ou registo distribuído, necessitam de um tratamento preciso dos carimbos de data e hora com fusos horários. O tipo de dados « TIMESTAMPTZ » no Milvus proporciona esta capacidade, armazenando carimbos de data e hora com o fuso horário associado.

O que é um campo TIMESTAMPTZ?

Um campo TIMESTAMPTZ é um tipo de dados definido pelo esquema (DataType.TIMESTAMPTZ) no Milvus que processa entradas que têm em conta o fuso horário e armazena todos os pontos temporais internamente como hora absoluta UTC:

  • Formato de entrada aceite: cadeias de caracteres ISO 8601 com um desvio de fuso horário (por exemplo, "2025-05-01T23:59:59+08:00" indica 23:59:59 do dia 1 de maio de 2025 (UTC+08:00)).

  • Armazenamento interno: Todos os valores « TIMESTAMPTZ » são normalizados e armazenados em Tempo Universal Coordenado (UTC).

  • Comparação e filtragem: Todas as operações de filtragem e ordenação são realizadas em UTC, garantindo resultados consistentes e previsíveis em diferentes fusos horários.

  • Pode definir « nullable=True » para os campos « TIMESTAMPTZ » de forma a permitir valores em falta.

  • Pode especificar um valor de carimbo de data/hora predefinido utilizando o atributo « default_value » no formato ISO 8601.

Consulte «Nullable & Default» para obter mais detalhes.

Operações básicas

O fluxo de trabalho básico da utilização de um campo « TIMESTAMPTZ » é semelhante ao de outros campos escalares no Milvus: definir o campo → inserir dados → consultar/filtrar.

Passo 1: Definir um campo TIMESTAMPTZ

Para utilizar um campo « TIMESTAMPTZ », defina-o explicitamente no esquema da sua coleção ao criar a coleção. O exemplo seguinte demonstra como criar uma coleção com um campo « tsz » do tipo « 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

Passo 2: Inserir dados

Insira entidades que contenham cadeias de caracteres ISO 8601 com desvios de fuso horário.

O exemplo abaixo insere 8 193 linhas de dados de amostra na coleção. Cada linha inclui:

  • um ID único

  • um carimbo de data/hora com consideração do fuso horário (hora de Xangai)

  • um vetor simples de 4 dimensões

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

Passo 3: Operações de filtragem

TIMESTAMPTZ suporta comparações escalares, aritmética de intervalos e extração de componentes temporais.

Antes de poder realizar operações de filtragem em campos d TIMESTAMPTZ, certifique-se de que:

  • Que tenha criado um índice em cada campo vetorial.

  • A coleção está carregada na memória.

Mostrar código de exemplo

# 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

Consulta com filtragem por carimbo de data/hora

Utilize operadores aritméticos como ==, !=, <, >, <=, >=. Para obter uma lista completa dos operadores aritméticos disponíveis no Milvus, consulte Operadores aritméticos.

O exemplo abaixo filtra entidades com carimbos de data/hora (tsz) que não sejam iguais a 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

No exemplo acima,

  • tsz é o nome do campo « TIMESTAMPTZ » definido no esquema.

  • ISO '2025-01-03T00:00:00+08:00' é um literal de carimbo temporal no formato ISO 8601, incluindo o desvio do fuso horário.

  • != compara o valor do campo com esse literal. Outros operadores suportados incluem ==, <, <=, > e >=.

Operações com intervalos

É possível realizar operações aritméticas em campos « TIMESTAMPTZ » utilizando valores «INTERVAL» no formato de duração ISO 8601. Isto permite-lhe somar ou subtrair durações, tais como dias, horas ou minutos, a um carimbo de data/hora ao filtrar dados.

Por exemplo, a consulta seguinte filtra entidades em que o carimbo de data/hora (tsz) mais zero dias não é igual a 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 Os valores seguem a sintaxe de duração da norma ISO 8601. Por exemplo:

  • P1D → 1 dia

  • PT3H → 3 horas

  • P2DT6H → 2 dias e 6 horas

Pode utilizar a aritmétic INTERVAL a diretamente em expressões de filtro, como por exemplo:

  • tsz + INTERVAL 'P3D' → Adiciona 3 dias

  • tsz - INTERVAL 'PT2H' → Subtrai 2 horas

Pesquisa com filtragem por carimbo de data/hora

Pode combinar a filtragem de « TIMESTAMPTZ » com a pesquisa de similaridade vetorial para restringir os resultados tanto por tempo como por similaridade.

# 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

Se a sua coleção tiver dois ou mais campos vetoriais, pode realizar operações de pesquisa híbrida com filtragem por carimbo de data/hora. Para mais detalhes, consulte Pesquisa híbrida multivetorial.

Utilização avançada

Para utilização avançada, pode gerir fusos horários a diferentes níveis (por exemplo, base de dados, coleção ou consulta) ou acelerar consultas em campos de « TIMESTAMPTZ » utilizando índices.

Gerir fusos horários em diferentes níveis

Pode controlar o fuso horário para campos TIMESTAMPTZ es ao nível da base de dados, da coleção ou da consulta/pesquisa.

Nível

Parâmetro

Âmbito

Prioridade

Base de dados

timezone

Predefinição para todas as coleções na base de dados

Mais baixo

Coleção

timezone

Substitui a configuração de fuso horário predefinida da base de dados para essa coleção

Médio

Consulta/pesquisa/pesquisa híbrida

timezone

Substituições temporárias para uma operação específica

Máximo

Para obter instruções passo a passo e exemplos de código, consulte as páginas dedicadas:

Acelerar consultas

Por predefinição, as consultas em campos « TIMESTAMPTZ » sem um índice realizam uma varredura completa de todas as linhas, o que pode ser lento em conjuntos de dados de grande dimensão. Para acelerar as consultas com carimbos de data/hora, crie um índice « STL_SORT » no seu campo « TIMESTAMPTZ ».

Para mais detalhes, consulte STL_SORT.