Indexação JSON
Os campos JSON fornecem uma maneira flexível de armazenar metadados estruturados no Milvus. Sem indexação, as consultas em campos JSON requerem varreduras de coleção completa, que se tornam lentas à medida que seu conjunto de dados cresce. A indexação JSON permite pesquisas rápidas criando índices dentro dos seus dados JSON.
A indexação JSON é ideal para:
Esquemas estruturados com chaves consistentes e conhecidas
Consultas de igualdade e intervalo em caminhos JSON específicos
Cenários em que é necessário um controlo preciso sobre as chaves que são indexadas
Aceleração eficiente do armazenamento de consultas direcionadas
Para documentos JSON complexos com diversos padrões de consulta, considere o JSON Shredding como uma alternativa.
Sintaxe de indexação JSON
Ao criar um índice JSON, você especifica:
Caminho JSON: A localização exata dos dados que deseja indexar
Tipo de conversão de dados: Como interpretar e armazenar os valores indexados
Conversão de tipo opcional: Transforma os dados durante a indexação, se necessário
Aqui está a sintaxe para indexar um campo JSON:
# Prepare index params
index_params = MilvusClient.prepare_index_params()
index_params.add_index(
field_name="<json_field_name>", # Name of the JSON field
index_type="AUTOINDEX", # Must be AUTOINDEX or INVERTED
index_name="<unique_index_name>", # Index name
params={
"json_path": "<path_to_json_key>", # Specific key to be indexed within JSON data
"json_cast_type": "<data_type>", # Data type to use when interpreting and indexing the value
# "json_cast_function": "<cast_function>" # Optional: convert key values into a target type at index time
}
)
Parâmetro |
Descrição |
Valor / Exemplo |
|---|---|---|
|
O nome do seu campo JSON no esquema de coleção. |
|
|
Deve ser |
|
|
Identificador único para este índice. |
|
|
O caminho para a chave que pretende indexar no seu objeto JSON. |
|
|
O tipo de dados a utilizar ao interpretar e indexar o valor. Deve corresponder ao tipo de dados real da chave. Para obter uma lista dos tipos de conversão disponíveis, consulte Tipos de conversão suportados abaixo. |
|
|
(Opcional) Converte valores de chave originais para um tipo de destino no momento da indexação. Esta configuração só é necessária quando os valores-chave são armazenados num formato errado e pretende converter o tipo de dados durante a indexação. Para obter uma lista das funções de conversão disponíveis, consulte Funções de conversão suportadas abaixo. |
|
Tipos de conversão suportados
O Milvus suporta os seguintes tipos de dados para conversão no momento da indexação. Estes tipos garantem que os seus dados são interpretados corretamente para uma filtragem eficiente.
Tipo de fundição |
Descrição |
Exemplo de valor JSON |
|---|---|---|
|
Utilizado para indexar valores booleanos, permitindo consultas que filtram em condições de verdadeiro/falso. |
|
|
Utilizado para valores numéricos, incluindo números inteiros e de vírgula flutuante. Permite a filtragem com base em intervalos ou igualdade (por exemplo, |
|
|
Utilizado para indexar valores de cadeia de caracteres, o que é comum para dados baseados em texto, como nomes, categorias ou IDs. |
|
|
Utilizado para indexar uma matriz de valores booleanos. |
|
|
Utilizado para indexar uma matriz de valores numéricos. |
|
|
Utiliza-se para indexar um conjunto de cadeias de caracteres, o que é ideal para uma lista de etiquetas ou palavras-chave. |
|
|
Objectos ou sub-objectos JSON inteiros com inferência automática de tipo e nivelamento. A indexação de objectos JSON inteiros aumenta o tamanho do índice. Para cenários com muitas chaves, considere a fragmentação de JSON. |
Qualquer objeto JSON |
As matrizes devem conter elementos do mesmo tipo para uma indexação ideal. Para obter mais informações, consulte Campo de matriz.
Funções de conversão suportadas
Se a chave do campo JSON contiver valores num formato incorreto (por exemplo, números armazenados como cadeias de caracteres), pode passar uma função de conversão para o argumento json_cast_function para converter estes valores no momento da indexação.
As funções de conversão não diferenciam maiúsculas de minúsculas. As seguintes funções são suportadas:
Função Cast |
Converte de → para |
Caso de uso |
|---|---|---|
|
String → Numérico (double) |
Converter |
Se a conversão falhar (por exemplo, cadeia de caracteres não numérica), o valor é ignorado e não é indexado.
Criar índices JSON
Esta secção demonstra como criar índices em diferentes tipos de dados JSON utilizando exemplos práticos. Todos os exemplos utilizam a estrutura JSON de amostra apresentada abaixo e assumem que já estabeleceu uma ligação ao MilvusClient com um esquema de coleção corretamente definido.
Exemplo de estrutura JSON
{
"metadata": {
"category": "electronics",
"brand": "BrandA",
"in_stock": true,
"price": 99.99,
"string_price": "99.99",
"tags": ["clearance", "summer_sale"],
"supplier": {
"name": "SupplierX",
"country": "USA",
"contact": {
"email": "support@supplierx.com",
"phone": "+1-800-555-0199"
}
}
}
}
Configuração básica
Antes de criar qualquer índice JSON, prepare seus parâmetros de índice:
# Prepare index params
index_params = MilvusClient.prepare_index_params()
Exemplo 1: indexar uma chave JSON simples
Crie um índice no campo category para permitir uma filtragem rápida por categoria de produto:
index_params.add_index(
field_name="metadata",
index_type="AUTOINDEX", # Must be set to AUTOINDEX or INVERTED for JSON path indexing
index_name="category_index", # Unique index name
params={
"json_path": 'metadata["category"]', # Path to the JSON key
"json_cast_type": "varchar" # Data cast type
}
)
Exemplo 2: Indexar uma chave aninhada
Crie um índice no campo email profundamente aninhado para pesquisas de contactos de fornecedores:
# Index the nested key
index_params.add_index(
field_name="metadata",
index_type="AUTOINDEX", # Must be set to AUTOINDEX or INVERTED for JSON path indexing
index_name="email_index", # Unique index name
params={
"json_path": 'metadata["supplier"]["contact"]["email"]', # Path to the nested JSON key
"json_cast_type": "varchar" # Data cast type
}
)
Exemplo 3: Converter o tipo de dados no momento do índice
Por vezes, os dados numéricos são armazenados por engano como cadeias de caracteres. Utilize a função de conversão STRING_TO_DOUBLE para os converter e indexar corretamente:
# Convert string numbers to double for indexing
index_params.add_index(
field_name="metadata",
index_type="AUTOINDEX", # Must be set to AUTOINDEX or INVERTED for JSON path indexing
index_name="string_to_double_index", # Unique index name
params={
"json_path": 'metadata["string_price"]', # Path to the JSON key to be indexed
"json_cast_type": "double", # Data cast type
"json_cast_function": "STRING_TO_DOUBLE" # Cast function; case insensitive
}
)
Importante: Se a conversão falhar para qualquer documento (por exemplo, uma cadeia de caracteres não numérica como "invalid"), o valor desse documento será excluído do índice e não aparecerá nos resultados filtrados.
Exemplo 4: Indexar objetos inteiros
Indexe o objeto JSON completo para permitir consultas em qualquer campo dentro dele. Quando você usa json_cast_type="JSON", o sistema automaticamente:
Achata a estrutura JSON: Os objectos aninhados são convertidos em caminhos planos para uma indexação eficiente
Infere tipos de dados: Cada valor é automaticamente categorizado como numérico, cadeia de caracteres, booleano ou data com base no seu conteúdo
Cria uma cobertura abrangente: Todas as chaves e caminhos aninhados dentro do objeto tornam-se pesquisáveis
Para a estrutura JSON de amostra acima, indexe todo o objeto metadata:
# Index the entire JSON object
index_params.add_index(
field_name="metadata",
index_type="AUTOINDEX",
index_name="metadata_full_index",
params={
"json_path": "metadata",
"json_cast_type": "JSON"
}
)
Também é possível indexar apenas uma parte da estrutura JSON, como todas as informações de supplier:
# Index a sub-object
index_params.add_index(
field_name="metadata",
index_type="AUTOINDEX",
index_name="supplier_index",
params={
"json_path": 'metadata["supplier"]',
"json_cast_type": "JSON"
}
)
Aplicar a configuração do índice
Depois de definir todos os seus parâmetros de índice, aplique-os à sua coleção:
# Apply all index configurations to the collection
MilvusClient.create_index(
collection_name="your_collection_name",
index_params=index_params
)
Assim que a indexação for concluída, suas consultas de campo JSON usarão automaticamente esses índices para um desempenho mais rápido.
PERGUNTAS FREQUENTES
O que acontece se a expressão de filtro de uma consulta usar um tipo diferente do tipo de elenco indexado?
Se a expressão do filtro usar um tipo diferente do tipo do índice json_cast_type, o Milvus não usará o índice e poderá voltar a uma pesquisa de força bruta mais lenta se os dados permitirem. Para obter o melhor desempenho, alinhe sempre a sua expressão de filtro com o tipo de conversão do índice. Por exemplo, se um índice numérico for criado com json_cast_type="double", apenas as condições de filtro numéricas aproveitarão o índice.
Ao criar um índice JSON, o que acontece se uma chave JSON tiver tipos de dados inconsistentes em diferentes entidades?
Tipos inconsistentes podem levar à indexação parcial. Por exemplo, se um campo metadata["price"] for armazenado como um número (99.99) e uma cadeia de caracteres ("99.99") e você criar um índice com json_cast_type="double", somente os valores numéricos serão indexados. As entradas em forma de cadeia de caracteres serão ignoradas e não aparecerão nos resultados do filtro.
Posso criar vários índices na mesma chave JSON?
Não, cada chave JSON suporta apenas um índice. Tem de escolher um único json_cast_type que corresponda aos seus dados. No entanto, pode criar um índice em todo o objeto JSON e um índice numa chave aninhada dentro desse objeto.
Um campo JSON suporta a definição de um valor predefinido?
Não, os campos JSON não suportam valores predefinidos. No entanto, pode definir nullable=True ao definir o campo para permitir entradas vazias. Para obter mais informações, consulte Nullable & Default.