Ricerca con chiave primariaCompatible with Milvus 2.6.9+
Quando si effettuano ricerche di similarità, viene sempre richiesto di fornire uno o più vettori di query, anche se i vettori di query sono già presenti nella collezione di destinazione. Per evitare di recuperare i vettori prima della ricerca, è possibile utilizzare le chiavi primarie.
Panoramica
Nelle piattaforme di e-commerce, gli utenti possono inserire una parola chiave per recuperare i prodotti che vi corrispondono. Una volta che l'utente visualizza la pagina di dettaglio di un prodotto, la piattaforma mostra anche un elenco di prodotti simili in fondo alla pagina per gli utenti che desiderano confrontarli.
Le raccomandazioni sono ordinate in base alla loro somiglianza con la parola chiave o con il prodotto corrente. Per ottenere questo risultato, gli sviluppatori della piattaforma devono recuperare la rappresentazione vettoriale della parola chiave o del prodotto corrente da Milvus prima dell'effettiva ricerca di somiglianza, il che aumenta i tempi di andata e ritorno tra la piattaforma e Milvus e comporta la trasmissione di un gran numero di float ad alta dimensionalità attraverso la rete.
Per semplificare la logica di interazione tra le applicazioni e Milvus, ridurre il numero di viaggi di andata e ritorno ed evitare la trasmissione di grandi quantità di valori in virgola mobile ad alta dimensione attraverso la rete, si può prendere in considerazione l'uso di ricerche a chiave primaria.
In una ricerca a chiave primaria, non è necessario fornire alcun vettore di interrogazione. Viene invece richiesto di fornire le chiavi primarie (ids) delle entità che contengono i vettori di interrogazione.
Limiti e restrizioni
Le ricerche con le chiavi primarie si applicano a tutti i tipi di dati vettoriali, ad eccezione dei campi vettoriali sparsi derivati da campi VarChar, come nelle funzioni BM25.
È possibile utilizzare le chiavi primarie al posto dei vettori di query nelle ricerche filtrate, per intervallo e per raggruppamento, eventualmente con la paginazione abilitata. Tuttavia, questa funzione non si applica alle ricerche ibride e agli iteratori di ricerca.
Per le ricerche di somiglianza che coinvolgono elenchi di incorporazioni, è ancora necessario recuperare i vettori di query, organizzarli in elenchi di incorporazioni ed eseguire le ricerche.
Non è possibile utilizzare chiavi primarie al posto dei vettori di query nelle API RESTful.
Per le chiavi primarie inesistenti o in formato non corretto, Milvus segnala un errore.
Le chiavi primarie e i vettori di query si escludono a vicenda. Anche se si forniscono entrambi, si verificano errori.
Esempi
Gli esempi seguenti presuppongono che tutti gli ID Int64 forniti siano disponibili nella collezione di destinazione.
Le chiavi primarie non vengono utilizzate per il filtraggio, ma solo per il recupero dei vettori.
Esempio 1: Ricerca a chiave primaria di base
Per effettuare una ricerca di base a chiave primaria, è sufficiente sostituire i vettori della query con le chiavi primarie.
from pymilvus import MilvusClient
client = MilvusClient(
uri="http://localhost:19530",
token="root:Milvus"
)
res = client.search(
collection_name="quick_setup",
anns_field="vector",
ids=[551, 296, 43], # a list of primary keys
limit=3,
search_params={"metric_type": "IP"}
)
for hits in res:
for hit in hits:
print(hit)
// java
// node.js
// go
# restful
Esempio 2: Ricerca filtrata con chiavi primarie
L'esempio seguente presuppone che color e likes siano due campi definiti dallo schema nell'insieme di destinazione.
res = client.search(
collection_name="my_collection",
ids=[551, 296, 43], #
filter='color like "red%" and likes > 50',
output_fields=["color", "likes"],
limit=3,
)
// java
// node.js
// go
# restful
Esempio 3: Ricerca filtrata con chiavi primarie
res = client.search(
collection_name="my_collection",
ids=[551, 296, 43],
limit=3,
search_params={
"params": {
"radius": 0.4,
"range_filter": 0.6
}
}
)
// java
// node.js
// go
# restful
Esempio 4: Ricerca per raggruppamento tramite chiavi primarie
L'esempio seguente presuppone che docId sia un campo definito dallo schema nell'insieme di destinazione.
res = client.search(
collection_name="my_collection",
ids=[551, 296, 43],
limit=3,
group_by_field="docId",
output_fields=["docId"]
)
// java
// node.js
// go
# restful