Cerca híbrida Milvus

Cerca Hibrida Milvus



A Milvus, una cerca híbrida és una cerca vectorial que incorpora el filtratge d'atributs. Utilitzant expressions booleanes específiques per filtrar els camps escalars o el camp de clau primària, podeu aplicar condicions específiques per restringir la cerca.

Aquest tutorial mostra com realitzar una cerca híbrida bàsica a Milvus mitjançant l'API de PyMilvus.

Requisits:

Per utilitzar els mètodes proporcionats i el codi d'aquesta publicació, assegureu-vos que teniu el següent:







  1. Accés a un servidor Milvus
  2. Python 3.10+ i superior
  3. PyMilvus instal·lat

Amb els requisits establerts, podem continuar amb el tutorial.



Crea una col·lecció

Abans de submergir-nos a realitzar una cerca híbrida a Milvus, comencem configurant una col·lecció bàsica amb finalitats de demostració.



Podem fer-ho configurant els paràmetres de col·lecció necessaris, com ara l'esquema de camp, l'esquema de la col·lecció i el nom de la col·lecció.





Utilitzem l'API de Milvus Python per crear una col·lecció principal per emmagatzemar la informació de la pel·lícula. Recordeu que es tracta de dades de demostració i no representen dades del món real ni configuració d'esquema.

des de pymilvus importar Esquema de col·lecció , Esquema de camp , Tipus de dades

movie_id = Esquema de camp (

nom = 'movie_id' ,

dtype = Tipus de dades. INT64 ,

és_primari = És cert ,

)

títol_pel·lícula = Esquema de camp (

nom = 'títol_pel·lícula' ,

dtype = Tipus de dades. VARCHAR ,

longitud_màx = 200 ,

)

cineasta = Esquema de camp (

nom = 'cineasta' ,

dtype = Tipus de dades. VARCHAR ,

longitud_màx = 100 ,

)

any_d'estrena_de la pel·lícula = Esquema de camp (

nom = 'any_d'estrena_de_pel·lícula' ,

dtype = Tipus de dades. INT64 ,

)

gènere_pel·lícula = Esquema de camp (

nom = 'gènere_pel·lícula' ,

dtype = Tipus de dades. VARCHAR ,

longitud_màx = 50 ,

)

introducció_pel·lícula = Esquema de camp (

nom = 'introducció_pel·lícula' ,

dtype = Tipus de dades. FLOAT_VECTOR ,

dim = 2

)

esquema = Esquema de col·lecció (

camps = [ movie_id , títol_pel·lícula , cineasta , any_d'estrena_de la pel·lícula , gènere_pel·lícula , introducció_pel·lícula ] ,

descripció = 'Cerca de pel·lícules' ,

activar_camp_dinàmic = És cert

)

nom_col·lecció = 'pel·lícula'

L'exemple anterior utilitza l'SDK de PyMilvus per configurar un esquema de col·lecció bàsic amb els paràmetres definits. Conté camps com ara 'film_id', 'film_title', 'film_release_year', etc.



Un cop acabem, podem crear la col·lecció utilitzant l'esquema anterior. El codi és el següent:

des de pymilvus importar Col · lecció

col · lecció = Col · lecció (

nom = nom_col·lecció ,

esquema = esquema ,

utilitzant = 'per defecte' ,

fragments_núm = 2

)

En crear-nos, podem utilitzar el mètode collection.insert() per inserir les dades de mostra a la col·lecció tal com es mostra a la definició següent:

data_pel·lícula = [

{

'movie_id' : 1 ,

'títol_pel·lícula' : 'Inició' ,

'cineasta' : 'Christopher Nolan' ,

'any_d'estrena_de_pel·lícula' : 2010 ,

'gènere_pel·lícula' : 'Ciència ficció' ,

'introducció_pel·lícula' : [ 0.1 , 0.5 ] , # Vector flotant de mostra

} ,

{

'movie_id' : 2 ,

'títol_pel·lícula' : 'La Redempció Shawshank' ,

'cineasta' : 'Frank Darabont' ,

'any_d'estrena_de_pel·lícula' : 1994 ,

'gènere_pel·lícula' : 'Drama' ,

'introducció_pel·lícula' : [ 0.2 , 0.7 ] , # Vector flotant de mostra

} ,

]

Per inserir les dades, connecteu-vos al servidor Milvus i truqueu al mètode insert() de la següent manera:

col · lecció = Col · lecció ( 'pel·lícula' )
Sr = col · lecció. inserir ( data_pel·lícula )

Això hauria d'inserir les 'dades de pel·lícula' que s'han definit prèviament a la col·lecció de pel·lícules.

Carregueu la col·lecció

Abans de cercar les dades que s'emmagatzemen a la col·lecció, hem de carregar la col·lecció des del disc del sistema a la memòria del sistema. Podeu consultar el nostre tutorial sobre Milvus Load Collection per obtenir més informació.

De moment, utilitzem el SDK de PyMilvus per carregar la col·lecció de pel·lícules a la memòria del sistema de la següent manera:

des de pymilvus importar Col · lecció

col · lecció = Col · lecció ( 'pel·lícula' )

col · lecció. càrrega ( )

Això hauria de fer disponible la col·lecció que ens permeti realitzar les cerques de destinació al servidor com el que demostrem als passos següents.

Cerca híbrida Milvus

Finalment, podem realitzar una cerca híbrida. Comencem per definir què és exactament una cerca híbrida Milvus.

A Milvus, una cerca híbrida és una tècnica de cerca que combina la cerca vectorial amb el filtratge d'atributs. Aquest enfocament ens permet cercar basant-se en similituds vectorials i condicions d'atributs específiques.

En aplicar les expressions booleanes per filtrar els camps escalars o el camp de clau primària, podem limitar la cerca per complir les condicions especificades.

Per tant, utilitzant una cerca híbrida a Milvus, introduïm la versatilitat i la precisió aprofitant la representació vectorial i el filtratge basat en atributs en una sola consulta.

NOTA: Milvus pot requerir-nos que creem un índex per a la col·lecció als camps que volem cercar. Al nostre exemple, podem crear un índex al camp 'film_intro' de la següent manera:

de pymilvus importar Col · lecció

col · lecció = Col · lecció ( 'pel·lícula' )

index_params = {
'tipus_índex' : 'IVF_FLAT' ,
'tipus_mètric' : 'L2' ,
'params' : {
'nart' : 2
}
}

col · lecció. crear_índex (
nom_camp = 'introducció_pel·lícula' ,
index_params = index_params ,
nom_índex = 'índex_intro'
)

Per crear també un índex a 'release_year', podem executar el codi de la següent manera:

des de pymilvus importar Col · lecció
col · lecció = Col · lecció ( 'pel·lícula' )
col · lecció. crear_índex (
nom_camp = 'any_d'estrena_de_pel·lícula' ,

nom_índex = 'índex_any'
)

Exemple de cerca híbrida de Milvus:

Demostrem com podem realitzar una cerca híbrida vectorial especificant una expressió booleana per filtrar el camp escalar de les entitats.

Considereu l'exemple següent:

search_param = {
'dades' : [ [ 0.1 , 0.2 ] ] ,
'anns_field' : 'introducció_pel·lícula' ,
'param' : { 'tipus_mètric' : 'L2' , 'params' : { 'nsonda' : 10 } , 'compensar' : 0 } ,
'límit' : 10 ,
'expr' : 'any_d'estrena_de_pel·lícula <= 2000' ,
}
res = col · lecció. cerca ( **search_param )
imprimir ( res )

En aquest cas, realitzem una cerca híbrida especificant una expressió booleana perquè coincideixi amb el valor on 'any_estrena_pel·lícula' és menor o igual que 2000.

Un cop executem el codi anterior, hauríem d'obtenir la sortida de la següent manera:

[ '['id: 2, distància: 0,2599999046325684, entitat: {}']' ]

En aquest cas, el valor coincident té un ID de 2 tal com es defineix a la segona entitat i la distància.

Codi font complet:

A continuació es mostra el codi font complet que s'utilitza en aquesta publicació, inclosa la creació d'esquemes, la inserció de dades i la cerca híbrida.

des de pymilvus importar Esquema de col·lecció , Esquema de camp , Tipus de dades , Col · lecció , connexions

connexions. connectar (

àlies = 'per defecte' ,

amfitrió = 'localhost' ,

port = '19530'

)

movie_id = Esquema de camp (

nom = 'movie_id' ,

dtype = Tipus de dades. INT64 ,

és_primari = És cert ,

)

títol_pel·lícula = Esquema de camp (

nom = 'títol_pel·lícula' ,

dtype = Tipus de dades. VARCHAR ,

longitud_màx = 200 ,

)

cineasta = Esquema de camp (

nom = 'cineasta' ,

dtype = Tipus de dades. VARCHAR ,

longitud_màx = 100 ,

)

any_d'estrena_de la pel·lícula = Esquema de camp (

nom = 'any_d'estrena_de_pel·lícula' ,

dtype = Tipus de dades. INT64 ,

)

gènere_pel·lícula = Esquema de camp (

nom = 'gènere_pel·lícula' ,

dtype = Tipus de dades. VARCHAR ,

longitud_màx = 50 ,

)

introducció_pel·lícula = Esquema de camp (

nom = 'introducció_pel·lícula' ,

dtype = Tipus de dades. FLOAT_VECTOR ,

dim = 2

)

esquema = Esquema de col·lecció (

camps = [ movie_id , títol_pel·lícula , cineasta , any_d'estrena_de la pel·lícula , gènere_pel·lícula , introducció_pel·lícula ] ,

descripció = 'Cerca de pel·lícules' ,

activar_camp_dinàmic = És cert

)

nom_col·lecció = 'pel·lícula'

col · lecció = Col · lecció (

nom = nom_col·lecció ,

esquema = esquema ,

utilitzant = 'per defecte' ,

fragments_núm = 2

)

data_pel·lícula = [

{

'movie_id' : 1 ,

'títol_pel·lícula' : 'Inició' ,

'cineasta' : 'Christopher Nolan' ,

'any_d'estrena_de_pel·lícula' : 2010 ,

'gènere_pel·lícula' : 'Ciència ficció' ,

'introducció_pel·lícula' : [ 0.1 , 0.5 ] , # Vector flotant de mostra

} ,

{

'movie_id' : 2 ,

'títol_pel·lícula' : 'La Redempció Shawshank' ,

'cineasta' : 'Frank Darabont' ,

'any_d'estrena_de_pel·lícula' : 1994 ,

'gènere_pel·lícula' : 'Drama' ,

'introducció_pel·lícula' : [ 0.2 , 0.7 ] , # Vector flotant de mostra

} ,

]

col · lecció = Col · lecció ( 'pel·lícula' )

Sr = col · lecció. inserir ( data_pel·lícula )

col · lecció = Col · lecció ( 'pel·lícula' )

col · lecció. càrrega ( )

search_param = {

'dades' : [ [ 0.1 , 0.2 ] ] ,

'anns_field' : 'introducció_pel·lícula' ,

'param' : { 'tipus_mètric' : 'L2' , 'params' : { 'nsonda' : 10 } , 'compensar' : 0 } ,

'límit' : 10 ,

'expr' : 'any_d'estrena_de_pel·lícula <= 2000' ,

}

res = col · lecció. cerca ( **search_param )

imprimir ( res )

Conclusió

Vam explorar el funcionament de Milvus aprenent sobre la cerca híbrida. També vam demostrar, utilitzant exemples pràctics, com crear esquemes, afegir dades i especificar les expressions booleanes en un camp d'entitat donat per realitzar una cerca híbrida com es desitgi.