Come utilizzare i dati sulle stringhe per potenziare le applicazioni di ricerca per similarità
Copertina
Milvus 2.1 è dotato di alcuni aggiornamenti significativi che rendono il lavoro con Milvus molto più semplice. Uno di questi è il supporto del tipo di dati stringa. Attualmente Milvus supporta tipi di dati quali stringhe, vettori, booleani, numeri interi, numeri in virgola mobile e altri ancora.
Questo articolo presenta un'introduzione al supporto del tipo di dati stringa. Leggete e imparate cosa potete fare con esso e come usarlo.
Vai a:
Il supporto del tipo di dati stringa è una delle funzioni più attese dagli utenti. Esso semplifica il processo di creazione di un'applicazione con il database vettoriale Milvus e accelera la velocità di ricerca per similarità e di interrogazione vettoriale, aumentando in larga misura l'efficienza e riducendo i costi di manutenzione dell'applicazione su cui si sta lavorando.
In particolare, Milvus 2.1 supporta il tipo di dati VARCHAR, che memorizza stringhe di caratteri di lunghezza variabile. Grazie al supporto del tipo di dati VARCHAR, è possibile:
- Gestire direttamente i dati stringa senza l'ausilio di un database relazionale esterno.
Il supporto del tipo di dati VARCHAR consente di saltare la fase di conversione delle stringhe in altri tipi di dati quando si inseriscono i dati in Milvus. Supponiamo che stiate lavorando a un sistema di ricerca di libri per la vostra libreria online. State creando un set di dati di libri e volete identificare i libri con i loro nomi. Mentre nelle versioni precedenti Milvus non supportava il tipo di dati stringa, prima di inserire i dati in Milvus, potrebbe essere necessario trasformare le stringhe (i nomi dei libri) in ID libro con l'aiuto di un database relazionale come MySQL. Ora come ora, dato che il tipo di dati stringa è supportato, si può semplicemente creare un campo stringa e inserire direttamente i nomi dei libri invece dei loro numeri ID.
La comodità si estende anche al processo di ricerca e di interrogazione. Immaginiamo che ci sia un cliente il cui libro preferito è Hello Milvus. Si vuole cercare nel sistema libri simili e consigliarli al cliente. Nelle versioni precedenti di Milvus, il sistema restituiva solo gli ID dei libri e bisognava fare un passo in più per controllare le informazioni sul libro corrispondente in un database relazionale. In Milvus 2.1, invece, è possibile ottenere direttamente i nomi dei libri, poiché è già stato creato un campo stringa con i nomi dei libri.
In poche parole, il supporto del tipo di dati stringa evita di dover ricorrere ad altri strumenti per gestire i dati stringa, semplificando notevolmente il processo di sviluppo.
- Accelerazione della velocità della ricerca ibrida e della query vettoriale grazie al filtraggio degli attributi.
Come altri tipi di dati scalari, VARCHAR può essere usato per filtrare gli attributi nella ricerca ibrida e nella query vettoriale attraverso un'espressione booleana. In particolare, Milvus 2.1 ha aggiunto l'operatore like
, che consente di eseguire la corrispondenza dei prefissi. Inoltre, è possibile eseguire una corrispondenza esatta utilizzando l'operatore ==
.
Inoltre, è supportato un indice invertito basato su MARISA-trie per accelerare la ricerca e l'interrogazione ibrida. Continuate a leggere e scoprite tutte le espressioni di stringa che desiderate conoscere per eseguire il filtraggio degli attributi con i dati di stringa.
Ora sappiamo che il tipo di dati stringa è estremamente utile, ma quando abbiamo bisogno di usarlo per costruire le nostre applicazioni? Di seguito verranno illustrati alcuni esempi di codice relativi a scenari che possono coinvolgere dati di tipo stringa, che consentiranno di capire meglio come gestire i dati VARCHAR in Milvus 2.1.
Creare una collezione
Seguiamo l'esempio precedente. Si sta ancora lavorando al sistema di raccomandazione dei libri e si vuole creare una raccolta di libri con un campo chiave primaria chiamato book_name
, in cui si inseriranno dati stringa. In questo caso, si può impostare il tipo di dati come DataType.VARCHAR
quando si imposta lo schema del campo, come mostrato nell'esempio seguente.
Si noti che quando si crea un campo VARCHAR, è necessario specificare la lunghezza massima dei caratteri attraverso il parametro max_length
, il cui valore può variare da 1 a 65.535. In questo esempio, abbiamo impostato la lunghezza massima a 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"
Inserire i dati
Ora che la collezione è stata creata, possiamo inserirvi dei dati. Nell'esempio seguente, inseriamo 2.000 righe di dati stringa generati casualmente.
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)],
]
Cancellare i dati
Supponiamo che due libri, denominati book_0
e book_1
, non siano più disponibili nel negozio e che si vogliano eliminare le relative informazioni dal database. In questo caso, si può usare l'espressione di termine in
per filtrare le entità da eliminare, come mostrato nell'esempio seguente.
Ricordate che Milvus supporta solo l'eliminazione di entità con chiavi primarie chiaramente specificate, quindi prima di eseguire il codice seguente, assicuratevi di aver impostato il campo book_name
come campo chiave primario.
expr = "book_name in [\"book_0\", \"book_1\"]"
from pymilvus import Collection
collection = Collection("book")
collection.delete(expr)
Creare un indice
Milvus 2.1 supporta la costruzione di indici scalari, che accelerano notevolmente il filtraggio dei campi stringa. A differenza della costruzione di un indice vettoriale, non è necessario preparare i parametri prima di costruire un indice scalare. Milvus supporta temporaneamente solo l'indice ad albero del dizionario (MARISA-trie), quindi il tipo di indice del campo di tipo VARCHAR è MARISA-trie per impostazione predefinita.
È possibile specificare il nome dell'indice durante la sua creazione. Se non viene specificato, il valore predefinito di index_name
è "_default_idx_"
. Nell'esempio seguente, abbiamo chiamato l'indice scalar_index
.
from pymilvus import Collection
collection = Collection("book")
collection.create_index(
field_name="book_name",
index_name="scalar_index",
)
Ricerca ibrida
Specificando espressioni booleane, è possibile filtrare i campi stringa durante una ricerca di similarità vettoriale.
Ad esempio, se si cercano i libri la cui introduzione è più simile a Hello Milvus ma si vogliono ottenere solo i libri il cui nome inizia con "book_2", si può usare l'operatore like
per eseguire una corrispondenza di prefisso e ottenere i libri mirati, come mostrato nell'esempio seguente.
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)
Espressioni di stringa
Oltre al nuovo operatore like
, per filtrare i campi stringa si possono usare anche altri operatori già supportati nelle versioni precedenti di Milvus. Di seguito sono riportati alcuni esempi di espressioni di stringa comunemente utilizzate, dove A
rappresenta un campo di tipo VARCHAR. Si ricorda che tutte le espressioni di stringa riportate di seguito possono essere combinate logicamente utilizzando gli operatori logici, come AND, OR e NOT.
Operazioni di set
È possibile utilizzare in
e not in
per realizzare operazioni di set, come ad esempio A in ["str1", "str2"]
.
Confronto tra due campi di stringhe
È possibile utilizzare gli operatori relazionali per confrontare i valori di due campi stringa. Tali operatori relazionali includono ==
, !=
, >
, >=
, <
, <=
. Per ulteriori informazioni, vedere Operatori relazionali.
Si noti che i campi stringa possono essere confrontati solo con altri campi stringa e non con campi di altri tipi di dati. Ad esempio, un campo di tipo VARCHAR non può essere confrontato con un campo di tipo booleano o di tipo intero.
Confronto di un campo con un valore costante
È possibile utilizzare ==
o !=
per verificare se il valore di un campo è uguale a un valore costante.
Filtrare i campi con un singolo intervallo
Si possono usare >
, >=
, <
, <=
per filtrare campi stringa con un singolo intervallo, come A > "str1"
.
Corrispondenza dei prefissi
Come già detto, Milvus 2.1 aggiunge l'operatore like
per la corrispondenza dei prefissi, come ad esempio A like "prefix%"
.
Il prossimo passo
Con il rilascio ufficiale di Milvus 2.1, abbiamo preparato una serie di blog che presentano le nuove funzionalità. Per saperne di più, leggete questa serie di blog:
- Come utilizzare i dati delle stringhe per potenziare le applicazioni di ricerca per similarità
- Utilizzo di Milvus incorporato per installare ed eseguire immediatamente Milvus con Python
- Aumentare la velocità di lettura del database vettoriale con le repliche in memoria
- Capire il livello di consistenza nel database vettoriale Milvus
- Capire il livello di consistenza del database vettoriale Milvus (parte II)
- In che modo il database vettoriale Milvus garantisce la sicurezza dei dati?
- Creare una collezione
- Inserire i dati
- Cancellare i dati
- Creare un indice
- Ricerca ibrida
- Espressioni di stringa
- Il prossimo passo
On This Page
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word