Indexar campos do StructArray
Crie índices nos subcampos do StructArray antes de executar uma pesquisa vetorial ou acelerar a filtragem escalar. Para um campo StructArray, o alvo do índice é um caminho de subcampo, como chunks[emb_list_vector], chunks[emb] ou chunks[section].
Esta página utiliza a coleção tech_articles da secção «Criar um campo StructArray». O campo StructArray chunks contém subcampos escalares para filtragem e subcampos vetoriais para pesquisa.
Antes de começar
Certifique-se de que o esquema da coleção já contém o campo StructArray « chunks » e que os dados foram inseridos.
| Caminho do subcampo | Tipo | Finalidade do índice |
|---|---|---|
chunks[emb_list_vector] | FLOAT_VECTOR | Pesquisa na EmbeddingList com métricas de « MAX_SIM* ». |
chunks[emb] | FLOAT_VECTOR | Pesquisa ao nível do elemento com métricas vetoriais normais. |
chunks[section] | VARCHAR | Filtragem categórica. |
chunks[quality_score] | FLOAT | Filtragem numérica e predicados do tipo intervalo. |
chunks[has_code] | BOOL | Filtragem booleana. |
Um campo vetorial ou subcampo vetorial aceita apenas um índice. Se precisar tanto da pesquisa EmbeddingList como da pesquisa ao nível do elemento, crie dois subcampos vetoriais separados e indexe-os separadamente. Nesta página, « chunks[emb_list_vector] » está indexado para a pesquisa EmbeddingList e « chunks[emb] » está indexado para a pesquisa ao nível do elemento.
Escolher índices
Utilize o modo de pesquisa para escolher a família de métricas vetoriais.
| Objetivo da pesquisa ou do filtro | Caminho de destino | O que escolher |
|---|---|---|
| Pesquisa na EmbeddingList | chunks[emb_list_vector] | Uma família de métricas « MAX_SIM* ». |
| Pesquisa vetorial ao nível do elemento | chunks[emb] | Uma família de métricas vetoriais regulares, como « COSINE », « IP » ou « L2 ». |
| Filtrar por cadeia de caracteres ou categoria | chunks[section] | Um índice escalar suportado pelo seu destino. |
| Filtrar por intervalo numérico | chunks[quality_score], chunks[page] | Um índice escalar suportado pelo seu destino. |
| Filtrar por valor booleano | chunks[has_code] | Um índice escalar suportado pelo seu destino. |
A pesquisa EmbeddingList trata os vetores num subcampo vetorial de StructArray como uma lista de incorporação e devolve resultados ao nível da entidade. A pesquisa ao nível do elemento pesquisa cada elemento de Struct de forma independente e pode devolver o deslocamento do elemento correspondente.
Criar índices vetoriais
O exemplo seguinte cria dois índices vetoriais. O primeiro índice utiliza uma métrica « MAX_SIM* » para a pesquisa «EmbeddingList». O segundo índice utiliza uma métrica vetorial normal para a pesquisa ao nível do elemento.
from pymilvus import MilvusClient
client = MilvusClient(
uri="http://localhost:19530",
token="root:Milvus",
)
index_params = client.prepare_index_params()
# Index for EmbeddingList search.
index_params.add_index(
field_name="chunks[emb_list_vector]",
index_name="chunks_emb_list_max_sim",
index_type="HNSW",
metric_type="MAX_SIM_COSINE",
params={
"M": 16,
"efConstruction": 200,
},
)
# Index for element-level search.
index_params.add_index(
field_name="chunks[emb]",
index_name="chunks_emb_cosine",
index_type="HNSW",
metric_type="COSINE",
params={
"M": 16,
"efConstruction": 200,
},
)
client.create_index(
collection_name="tech_articles",
index_params=index_params,
)
Aviso
Não crie um índice « MAX_SIM* » e um índice com métrica vetorial normal no mesmo subcampo vetorial. Se forem necessários ambos os modos de pesquisa, grave os vetores em dois subcampos vetoriais separados e crie um índice para cada subcampo.
Criar índices escalares
Crie índices escalares nos subcampos escalares do StructArray quando os utilizar em filtros. Utilize a mesma sintaxe de caminho « structArray[subfield] ».
index_params = client.prepare_index_params()
index_params.add_index(
field_name="chunks[section]",
index_name="chunks_section_inverted",
index_type="INVERTED",
)
index_params.add_index(
field_name="chunks[has_code]",
index_name="chunks_has_code_inverted",
index_type="INVERTED",
)
index_params.add_index(
field_name="chunks[quality_score]",
index_name="chunks_quality_score_sort",
index_type="STL_SORT",
)
index_params.add_index(
field_name="chunks[page]",
index_name="chunks_page_sort",
index_type="STL_SORT",
)
client.create_index(
collection_name="tech_articles",
index_params=index_params,
)
Os índices escalares são opcionais, mas úteis quando os subcampos escalares do StructArray aparecem frequentemente em filtros, tais como « element_filter(chunks, $[quality_score] > 0.9) » ou « MATCH_ANY(chunks, $[section] == "index") ».
Compatibilidade de métricas de índice
Utilize as tabelas seguintes para escolher um tipo de índice e um tipo de métrica para um subcampo vetorial do StructArray. Comece pelo destino e, em seguida, escolha a família de métricas por modo de pesquisa.
Escolha um tipo de índice e um tipo de métrica do Milvus a partir das seguintes tabelas de compatibilidade.
Pesquisa EmbeddingList
A pesquisa EmbeddingList utiliza métricas do tipo « MAX_SIM* ». Trata os vetores num subcampo de tipo «StructArray» como uma lista de incorporação e devolve resultados ao nível da entidade.
| Tipo de dados do subcampo vetorial | Tipo de índice | Tipo de métrica |
|---|---|---|
FLOAT_VECTOR, FLOAT16_VECTOR, BFLOAT16_VECTOR | IVF_FLAT, IVF_FLAT_CC, HNSW, HNSW_SQ, HNSW_PQ, HNSW_PRQ, DISKANN | MAX_SIM, MAX_SIM_COSINE, MAX_SIM_IP, MAX_SIM_L2 |
INT8_VECTOR | HNSW, HNSW_SQ, HNSW_PQ, HNSW_PRQ | MAX_SIM, MAX_SIM_COSINE, MAX_SIM_IP, MAX_SIM_L2 |
BINARY_VECTOR | HNSW | MAX_SIM_HAMMING, MAX_SIM_JACCARD |
Pesquisa ao nível do elemento
A pesquisa ao nível do elemento utiliza métricas vetoriais normais. Pesquisa cada elemento da Struct de forma independente e pode devolver o deslocamento do elemento correspondente.
| Tipo de dados do subcampo do vetor | Tipo de índice | Tipo de métrica |
|---|---|---|
FLOAT_VECTOR, FLOAT16_VECTOR, BFLOAT16_VECTOR | FLAT, IVF_FLAT, IVF_FLAT_CC, IVF_SQ8, IVF_SQ_CC, IVF_PQ, SCANN, IVF_RABITQ, IVF_RABITQ_FASTSCAN, HNSW, HNSW_SQ, HNSW_PQ, HNSW_PRQ, DISKANN | L2, IP, COSINE |
INT8_VECTOR | HNSW, HNSW_SQ, HNSW_PQ, HNSW_PRQ | L2, IP, COSINE |
BINARY_VECTOR | HNSW | HAMMING, JACCARD |
BINARY_VECTOR | BIN_FLAT | HAMMING, JACCARD, SUBSTRUCTURE, SUPERSTRUCTURE, MHJACCARD |
BINARY_VECTOR | BIN_IVF_FLAT | HAMMING, JACCARD |
Para obter assistência específica para cada versão e conhecer outros limites, consulte Limites do StructArray.
Verificar índices
Após criar os índices, descreva os índices da coleção ou da lista para confirmar se os caminhos dos subcampos esperados estão indexados.
indexes = client.list_indexes(
collection_name="tech_articles",
)
print(indexes)
Também pode descrever um índice específico se a sua versão do SDK disponibilizar APIs de descrição de índices.
index = client.describe_index(
collection_name="tech_articles",
index_name="chunks_emb_cosine",
)
print(index)
Regras de indexação
| Regra | Explicação |
|---|---|
| Utilize a sintaxe de caminho para índices de subcampos. | chunks[emb] e o índice como « », e não como « emb » ou « chunks.emb ». |
| Um subcampo vetorial aceita um único índice. | Utilize subcampos vetoriais separados se necessitar de famílias de métricas diferentes. |
Utilize métricas do tipo « MAX_SIM* » para a pesquisa no EmbeddingList. | Os dados de consulta da EmbeddingList requerem um índice criado com uma métrica do tipo « MAX_SIM* ». |
| Utilize métricas vetoriais normais para a pesquisa ao nível do elemento. | A pesquisa ao nível do elemento utiliza dados de consulta vetoriais regulares e métricas como « COSINE », « IP » ou « L2 ». |
| Indexe os subcampos escalares que aparecem nos filtros. | Utilize tipos de índice escalar suportados pelo seu destino. |
| Tenha em conta os limites dos campos vetoriais. | O número total de campos vetoriais e subcampos vetoriais é limitado. Consulte «Limites do StructArray» antes de adicionar muitos subcampos vetoriais. |
Erros comuns
Criar um índice em «
chunks.emb» em vez de «chunks[emb]».Criar apenas um índice «
MAX_SIM*» e, em seguida, tentar executar uma pesquisa ao nível do elemento no mesmo subcampo.Criar apenas um índice vetorial normal e, em seguida, tentar executar uma pesquisa EmbeddingList no mesmo subcampo.
Reutilizar um subcampo vetorial tanto para métricas «
MAX_SIM*» como para métricas vetoriais normais.Esquecer os índices escalares para filtros StructArray muito utilizados.
Indexar um subcampo StructArray que não existe no esquema Struct.
Próximos passos
Para executar uma pesquisa EmbeddingList ao nível da entidade ou uma pesquisa vetorial ao nível do elemento, consulte Pesquisa vetorial básica com StructArray.
Para filtrar subcampos escalares do StructArray durante a pesquisa, leia «Pesquisa filtrada com StructArray».
Para consultar os limites de índices e métricas, leia «Limites do StructArray».