milvus-logo
LFAI
Home
  • Conceitos

Índice escalar

O Milvus suporta pesquisas filtradas que combinam campos escalares e vectoriais. Para aumentar a eficiência das pesquisas que envolvem campos escalares, o Milvus introduziu a indexação de campos escalares a partir da versão 2.1.0. Este artigo fornece uma visão geral da indexação de campos escalares no Milvus, ajudando-o a compreender o seu significado e implementação.

Visão geral

Ao efetuar pesquisas de semelhança vetorial no Milvus, pode utilizar operadores lógicos para organizar campos escalares em expressões booleanas.

Quando o Milvus recebe um pedido de pesquisa com uma expressão booleana deste tipo, analisa a expressão booleana numa árvore de sintaxe abstrata (AST) para gerar um plano físico para filtragem de atributos. O Milvus aplica então o plano físico em cada segmento para gerar um conjunto de bits como resultado da filtragem e inclui o resultado como parâmetro de pesquisa vetorial para limitar o âmbito da pesquisa. Neste caso, a velocidade das pesquisas vectoriais depende fortemente da velocidade da filtragem de atributos.

Attribute filtering in a segment Filtragem de atributos num segmento

A indexação de campos escalares é uma forma de garantir a velocidade da filtragem de atributos, ordenando os valores dos campos escalares de uma forma específica para acelerar a recuperação de informação.

Algoritmos de indexação de campos escalares

O objetivo do Milvus é conseguir uma baixa utilização de memória, uma elevada eficiência de filtragem e um tempo de carregamento curto com os seus algoritmos de indexação de campos escalares. Estes algoritmos são classificados em dois tipos principais: indexação automática e indexação invertida.

Indexação automática

Milvus fornece a opção AUTOINDEX para evitar que tenha de escolher manualmente um tipo de índice. Ao chamar o método create_index, se o index_type não for especificado, o Milvus seleciona automaticamente o tipo de índice mais adequado com base no tipo de dados.

A tabela seguinte lista os tipos de dados que o Milvus suporta e os algoritmos de indexação automática correspondentes.

Tipo de dadosAlgoritmo de indexação automática
VARCHARÍndice invertido
INT8Índice invertido
INT16Índice invertido
INT32Índice invertido
INT64Índice invertido
FLOATÍndice invertido
DOUBLEÍndice invertido

Indexação invertida

A indexação invertida oferece uma forma flexível de criar um índice para um campo escalar, especificando manualmente os parâmetros do índice. Este método funciona bem em vários cenários, incluindo consultas pontuais, consultas de correspondência de padrões, pesquisas de texto completo, pesquisas JSON, pesquisas booleanas e até mesmo consultas de correspondência de prefixos.

Os índices invertidos implementados no Milvus são alimentados por Tantivy, uma biblioteca de motor de pesquisa de texto completo. Tantivy garante que a indexação invertida em Milvus é eficiente e rápida.

Um índice invertido tem dois componentes principais: um dicionário de termos e uma lista invertida. O dicionário de termos inclui todas as palavras tokenizadas ordenadas alfabeticamente, enquanto a lista invertida contém a lista de documentos onde cada palavra aparece. Esta configuração torna as consultas por pontos e por intervalos muito mais rápidas e eficientes do que as pesquisas de força bruta.

Inverted index diagram Diagrama de índice invertido

As vantagens da utilização de um índice invertido são particularmente evidentes nas seguintes operações:

  • Consulta pontual: Por exemplo, ao procurar documentos que contenham a palavra Milvus, o processo começa por verificar se Milvus está presente no dicionário de termos. Se não for encontrado, nenhum documento contém a palavra. No entanto, se for encontrada, a lista invertida associada a Milvus é recuperada, indicando os documentos que contêm a palavra. Este método é muito mais eficiente do que uma pesquisa de força bruta num milhão de documentos, uma vez que o dicionário de termos ordenado reduz significativamente a complexidade do tempo para encontrar a palavra Milvus.
  • Consulta de intervalo: A eficiência das consultas de intervalo, como encontrar documentos com palavras alfabeticamente superiores a muito, também é melhorada pelo dicionário de termos ordenados. Esta abordagem é mais eficiente do que uma pesquisa de força bruta, fornecendo resultados mais rápidos e mais exactos.

Resultados dos testes

Para demonstrar as melhorias de desempenho proporcionadas pelos índices escalares no Milvus, foi efectuada uma experiência que comparou o desempenho de várias expressões utilizando a indexação invertida e a pesquisa de força bruta em dados brutos.

A experiência envolveu testar várias expressões em duas condições: com um índice invertido e com uma pesquisa de força bruta. Para garantir a equidade, foi mantida a mesma distribuição de dados entre os testes, utilizando sempre a mesma coleção. Antes de cada teste, a coleção foi libertada e o índice foi eliminado e reconstruído. Além disso, uma consulta quente foi realizada antes de cada teste para minimizar o impacto dos dados frios e quentes, e cada consulta foi executada várias vezes para garantir a precisão.

Para um conjunto de dados de 1 milhão de registos, a utilização de um índice invertido pode proporcionar uma melhoria de desempenho até 30 vezes superior para consultas pontuais. Os ganhos de desempenho podem ser ainda mais significativos para conjuntos de dados maiores.

Recomendações de desempenho

Para tirar o máximo partido da capacidade do Milvus na indexação de campos escalares e libertar o seu poder nas pesquisas de semelhança vetorial, pode ser necessário um modelo para estimar o tamanho da memória necessária com base nos dados que possui.

As tabelas seguintes listam as funções de estimativa para todos os tipos de dados que o Milvus suporta.

  • Campos numéricos

    Tipo de dadosFunção de estimativa de memória (MB)
    INT8numOfRows * 12 / 1024 / 1024
    INT16numOfRows * 12 / 1024 / 1024
    INT32numOfRows * 12 / 1024 / 1024
    INT64numOfRows * 24 / 1024 / 1024
    FLOAT32numOfRows * 12 / 1024 / 1024
    DOUBLEnumOfRows * 24 / 1024 / 1024
  • Campos da cadeia de caracteres

    Comprimento da cadeiaFunção de estimativa de memória (MB)
    (0, 8]numOfRows * 128 / 1024 / 1024
    (8, 16]numOfRows * 144 / 1024 / 1024
    (16, 32]numOfRows * 160 / 1024 / 1024
    (32, 64]numOfRows * 192 / 1024 / 1024
    (64, 128]numOfRows * 256 / 1024 / 1024
    (128, 65535]numOfRows * strLen * 1.5 / 1024 / 1024

O que se segue

Traduzido porDeepLogo

Try Managed Milvus for Free

Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

Get Started
Feedback

Esta página foi útil?