🚀 Experimente o Zilliz Cloud, o Milvus totalmente gerenciado, gratuitamente—experimente um desempenho 10x mais rápido! Experimente Agora>>

milvus-logo
LFAI
  • Home
  • Blog
  • Como utilizar dados de cadeias de caracteres para potenciar as suas aplicações de pesquisa por semelhança

Como utilizar dados de cadeias de caracteres para potenciar as suas aplicações de pesquisa por semelhança

  • Engineering
August 08, 2022
Xi Ge

Cover Capa

O Milvus 2.1 vem com algumas actualizações significativas que tornam o trabalho com o Milvus muito mais fácil. Uma delas é o suporte do tipo de dados string. Neste momento, o Milvus suporta tipos de dados que incluem strings, vectores, booleanos, inteiros, números de vírgula flutuante e muito mais.

Este artigo apresenta uma introdução ao suporte do tipo de dados string. Leia e saiba o que pode fazer com ele e como o utilizar.

Saltar para:

O suporte do tipo de dados string tem sido uma das funções mais esperadas pelos utilizadores. Esta função simplifica o processo de construção de uma aplicação com a base de dados vetorial do Milvus e acelera a velocidade da pesquisa por semelhança e da consulta vetorial, aumentando largamente a eficiência e reduzindo o custo de manutenção de qualquer aplicação em que esteja a trabalhar.

Especificamente, o Milvus 2.1 suporta o tipo de dados VARCHAR, que armazena cadeias de caracteres de comprimento variável. Com o suporte do tipo de dados VARCHAR, é possível:

  1. Gerenciar diretamente dados de string sem a ajuda de um banco de dados relacional externo.

O suporte do tipo de dados VARCHAR permite-lhe saltar a etapa de conversão de cadeias de caracteres noutros tipos de dados quando insere dados no Milvus. Digamos que está a trabalhar num sistema de pesquisa de livros para a sua própria livraria online. Está a criar um conjunto de dados de livros e pretende identificar os livros com os seus nomes. Enquanto nas versões anteriores o Milvus não suportava o tipo de dados string, antes de inserir dados no MIilvus, pode ser necessário transformar primeiro as strings (os nomes dos livros) em IDs de livros com a ajuda de uma base de dados relacional como o MySQL. Neste momento, como o tipo de dados string é suportado, pode simplesmente criar um campo string e introduzir diretamente os nomes dos livros em vez dos respectivos números de ID.

A conveniência também se aplica ao processo de pesquisa e consulta. Imagine que há um cliente cujo livro favorito é "Hello Milvus". Pretende procurar no sistema livros semelhantes e recomendá-los ao cliente. Nas versões anteriores do Milvus, o sistema apenas lhe devolve os IDs dos livros e é necessário dar um passo extra para verificar a informação do livro correspondente numa base de dados relacional. Mas no Milvus 2.1, pode obter diretamente os nomes dos livros, uma vez que já criou um campo de cadeia de caracteres com os nomes dos livros.

Em suma, o suporte do tipo de dados string poupa-lhe o esforço de recorrer a outras ferramentas para gerir dados string, o que simplifica bastante o processo de desenvolvimento.

  1. Acelere a velocidade da pesquisa híbrida e da consulta vetorial através da filtragem de atributos.

Tal como outros tipos de dados escalares, o VARCHAR pode ser utilizado para filtragem de atributos na pesquisa híbrida e na consulta vetorial através de expressões booleanas. É particularmente importante referir que o Milvus 2.1 adiciona o operador like, que lhe permite efetuar correspondências de prefixos. Além disso, é possível efetuar uma correspondência exacta utilizando o operador ==.

Além disso, é suportado um índice invertido baseado na MARISA-trie para acelerar a pesquisa e a consulta híbridas. Continue a ler e descubra todas as expressões de cadeia que pode querer saber para efetuar a filtragem de atributos com dados de cadeia.

Agora sabemos que o tipo de dados "string" é extremamente útil, mas quando é que precisamos exatamente de utilizar este tipo de dados na construção das nossas próprias aplicações? A seguir, verá alguns exemplos de código de cenários que podem envolver dados string, o que lhe dará uma melhor compreensão de como gerir dados VARCHAR no Milvus 2.1.

Criar uma coleção

Vamos seguir o exemplo anterior. Ainda está a trabalhar no sistema de recomendação de livros e pretende criar uma coleção de livros com um campo de chave primária chamado book_name, no qual irá inserir dados em string. Neste caso, pode definir o tipo de dados como DataType.VARCHARao definir o esquema do campo, como mostra o exemplo abaixo.

Tenha em atenção que, ao criar um campo VARCHAR, é necessário especificar o comprimento máximo dos caracteres através do parâmetro max_length, cujo valor pode variar entre 1 e 65.535. Neste exemplo, definimos o comprimento máximo como 200.

from pymilvus import CollectionSchema, FieldSchema, DataType
book_id = FieldSchema(
  name="book_id", 
  dtype=DataType.INT64, 
)
book_name = FieldSchema( 
  name="book_name", 
  dtype=DataType.VARCHAR, 
  max_length=200, 
  is_primary=True, 
)
word_count = FieldSchema(
  name="word_count", 
  dtype=DataType.INT64,  
)
book_intro = FieldSchema(
  name="book_intro", 
  dtype=DataType.FLOAT_VECTOR, 
  dim=2
)
schema = CollectionSchema(
  fields=[book_id, word_count, book_intro], 
  description="Test book search"
)
collection_name = "book"

Inserir dados

Agora que a coleção foi criada, podemos inserir dados na mesma. No exemplo seguinte, inserimos 2.000 linhas de dados de cadeia de caracteres gerados aleatoriamente.

import random
data = [
  [i for i in range(2000)],
  ["book_" + str(i) for i in range(2000)],
  [i for i in range(10000, 12000)],
  [[random.random() for _ in range(2)] for _ in range(2000)],
]

Eliminar dados

Suponha que dois livros, denominados book_0 e book_1, já não estão disponíveis na sua loja, pelo que pretende eliminar as informações relevantes da sua base de dados. Neste caso, pode utilizar a expressão de termo in para filtrar as entidades a eliminar, como mostra o exemplo abaixo.

Lembre-se que o Milvus apenas suporta a eliminação de entidades com chaves primárias claramente especificadas, por isso, antes de executar o código seguinte, certifique-se de que definiu o campo book_name como o campo de chave primária.

expr = "book_name in [\"book_0\", \"book_1\"]" 
from pymilvus import Collection
collection = Collection("book")     
collection.delete(expr)

Construir um índice

Milvus 2.1 suporta a construção de índices escalares, o que irá acelerar muito a filtragem de campos de string. Ao contrário da construção de um índice vetorial, não é necessário preparar parâmetros antes de construir um índice escalar. Milvus temporariamente só suporta o índice de árvore de dicionário (MARISA-trie), por isso o tipo de índice do campo do tipo VARCHAR é MARISA-trie por defeito.

Pode especificar o nome do índice ao construí-lo. Se não for especificado, o valor predefinido de index_name é "_default_idx_". No exemplo abaixo, chamámos ao índice scalar_index.

from pymilvus import Collection
collection = Collection("book")   
collection.create_index(
  field_name="book_name", 
  index_name="scalar_index",
)

Ao especificar expressões booleanas, pode filtrar os campos de cadeia de caracteres durante uma pesquisa de semelhança de vetor.

Por exemplo, se estiver a procurar livros cuja introdução seja mais semelhante a Hello Milvus, mas apenas pretender obter os livros cujos nomes comecem por 'book_2', pode utilizar o operador likepara efetuar uma correspondência de prefixo e obter os livros visados, como se mostra no exemplo abaixo.

search_param = {
  "data": [[0.1, 0.2]],
  "anns_field": "book_intro",
  "param": {"metric_type": "L2", "params": {"nprobe": 10}},
  "limit": 2,
  "expr": "book_name like \"Hello%\"",
}
res = collection.search(**search_param)

Expressões de cadeia de caracteres

Para além do novo operador like, outros operadores, que já eram suportados em versões anteriores do Milvus, também podem ser utilizados para filtrar campos de cadeia de caracteres. Seguem-se alguns exemplos de expressões de cadeia normalmente utilizadas, em que A representa um campo do tipo VARCHAR. Lembre-se de que todas as expressões de cadeia de caracteres abaixo podem ser combinadas logicamente usando operadores lógicos, como AND, OR e NOT.

Operações de conjunto

Pode utilizar in e not in para efetuar operações de conjunto, como A in ["str1", "str2"].

Comparar dois campos de cadeia de caracteres

Pode utilizar operadores relacionais para comparar os valores de dois campos de cadeia de caracteres. Estes operadores relacionais incluem ==, !=, >, >=, <, <=. Para obter mais informações, consulte Operadores relacionais.

Note que os campos de cadeia de caracteres só podem ser comparados com outros campos de cadeia de caracteres em vez de campos de outros tipos de dados. Por exemplo, um campo do tipo VARCHAR não pode ser comparado com um campo do tipo Boolean ou do tipo integer.

Comparar um campo com um valor constante

Você pode usar == ou != para verificar se o valor de um campo é igual a um valor constante.

Filtrar campos com um único intervalo

Pode utilizar >, >=, <, <= para filtrar campos de cadeia de caracteres com um único intervalo, como A > "str1".

Correspondência de prefixos

Como mencionado anteriormente, o Milvus 2.1 adiciona o operador like para correspondência de prefixo, como A like "prefix%".

O que vem a seguir

Com o lançamento oficial do Milvus 2.1, preparámos uma série de blogues que apresentam as novas funcionalidades. Leia mais nesta série de blogues:

Try Managed Milvus for Free

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

Get Started

Like the article? Spread the word

Continue Lendo