Í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.
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 dados | Algoritmo 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.
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 dados Função de estimativa de memória (MB) INT8 numOfRows * 12 / 1024 / 1024 INT16 numOfRows * 12 / 1024 / 1024 INT32 numOfRows * 12 / 1024 / 1024 INT64 numOfRows * 24 / 1024 / 1024 FLOAT32 numOfRows * 12 / 1024 / 1024 DOUBLE numOfRows * 24 / 1024 / 1024 Campos da cadeia de caracteres
Comprimento da cadeia Funçã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
Para indexar um campo escalar, leia Criar um índice em escalares.
Para saber mais sobre os termos e regras relacionados mencionados acima, leia