Insertar datos en campos StructArray

Inserta datos en un campo StructArray cuando cada entidad contenga una lista ordenada de elementos estructurados. En la carga útil de inserción, un campo StructArray se representa como una matriz de objetos. Cada objeto representa un elemento Struct y utiliza los nombres de los subcampos Struct definidos en el esquema de la colección.

Esta página utiliza la colección « tech_articles » de «Crear un campo StructArray». Cada entidad es un artículo técnico, y el campo « chunks » almacena fragmentos del artículo como elementos Struct.

Antes de empezar

Asegúrate de que el esquema de la colección ya contiene el campo StructArray « chunks ».

CampoTipoValor de inserción
doc_idINT64ID del artículo.
titleVARCHARTítulo del artículo.
categoryVARCHARCategoría del artículo.
title_vectorFLOAT_VECTORIncrustación a nivel de artículo.
chunksARRAYUna lista de objetos «chunk».

Cada objeto de « chunks » debe seguir el esquema «Struct».

SubcampoTipoValor de inserción
textVARCHARTexto del fragmento.
sectionVARCHARNombre de la sección, como « index », « search » o « filter ».
pageINT64Número de página o posición lógica.
quality_scoreFLOATPuntuación a nivel de fragmento.
has_codeBOOLSi el fragmento contiene código.
emb_list_vectorFLOAT_VECTORVector escrito para la búsqueda en EmbeddingList.
embFLOAT_VECTORVector escrito para la búsqueda a nivel de elemento.

En una carga útil de inserción, « chunks » es un campo normal cuyo valor es una matriz de objetos Struct. Dentro de cada objeto, utiliza nombres de subcampos como « text » y « emb ». Utiliza la sintaxis de ruta, como « chunks[text] » o « chunks[emb] », solo después de la inserción, cuando crees índices, realices búsquedas, crees filtros o especifiques campos de salida.

Comprender la estructura de la carga útil de inserción

El valor de ` chunks ` es una matriz de elementos `Struct`. Cada elemento es un objeto cuyas claves son nombres de subcampos.

{
  "doc_id": 1,
  "title": "StructArray indexing patterns",
  "category": "index",
  "title_vector": [0.12, 0.08, 0.32, 0.48],
  "chunks": [
    {
      "text": "Create one index for each vector subfield.",
      "section": "index",
      "page": 1,
      "quality_score": 0.96,
      "has_code": false,
      "emb_list_vector": [0.10, 0.20, 0.30, 0.40],
      "emb": [0.10, 0.20, 0.30, 0.40]
    },
    {
      "text": "Use MAX_SIM metrics for EmbeddingList search.",
      "section": "index",
      "page": 2,
      "quality_score": 0.91,
      "has_code": true,
      "emb_list_vector": [0.16, 0.24, 0.35, 0.45],
      "emb": [0.16, 0.24, 0.35, 0.45]
    }
  ]
}

emb_list_vector y emb son subcampos vectoriales independientes, ya que admiten modos de búsqueda diferentes. La búsqueda de EmbeddingList trata todos los vectores de un campo StructArray como una única lista de incrustaciones y devuelve resultados a nivel de entidad con métricas de MAX_SIM*. La búsqueda a nivel de elemento busca cada elemento Struct de forma independiente y puede devolver el desplazamiento del elemento coincidente. En este ejemplo, para simplificar, se almacenan los mismos valores vectoriales en ambos campos. En una aplicación de producción, se pueden almacenar las mismas representaciones en ambos subcampos cuando ambos modos de búsqueda utilizan la misma representación de fragmentos, o bien almacenar representaciones diferentes cuando los dos modos de búsqueda utilizan representaciones distintas.

Insertar filas

Utiliza « client.insert() » para insertar filas que contengan valores de StructArray.

from pymilvus import MilvusClient

client = MilvusClient(
    uri="http://localhost:19530",
    token="root:Milvus",
)

data = [
    {
        "doc_id": 1,
        "title": "StructArray indexing patterns",
        "category": "index",
        "title_vector": [0.12, 0.08, 0.32, 0.48],
        "chunks": [
            {
                "text": "Create one index for each vector subfield.",
                "section": "index",
                "page": 1,
                "quality_score": 0.96,
                "has_code": False,
                "emb_list_vector": [0.10, 0.20, 0.30, 0.40],
                "emb": [0.10, 0.20, 0.30, 0.40],
            },
            {
                "text": "Use MAX_SIM metrics for EmbeddingList search.",
                "section": "index",
                "page": 2,
                "quality_score": 0.91,
                "has_code": True,
                "emb_list_vector": [0.16, 0.24, 0.35, 0.45],
                "emb": [0.16, 0.24, 0.35, 0.45],
            },
        ],
    },
    {
        "doc_id": 2,
        "title": "Filtered StructArray search",
        "category": "filter",
        "title_vector": [0.20, 0.18, 0.22, 0.40],
        "chunks": [
            {
                "text": "Use element_filter to match scalar conditions within the same Struct element.",
                "section": "filter",
                "page": 1,
                "quality_score": 0.93,
                "has_code": True,
                "emb_list_vector": [0.21, 0.18, 0.33, 0.44],
                "emb": [0.21, 0.18, 0.33, 0.44],
            },
            {
                "text": "MATCH_LEAST checks how many elements satisfy a predicate.",
                "section": "filter",
                "page": 2,
                "quality_score": 0.88,
                "has_code": False,
                "emb_list_vector": [0.24, 0.22, 0.31, 0.39],
                "emb": [0.24, 0.22, 0.31, 0.39],
            },
        ],
    },
    {
        "doc_id": 3,
        "title": "Element-level search with offsets",
        "category": "search",
        "title_vector": [0.33, 0.11, 0.29, 0.37],
        "chunks": [
            {
                "text": "Element-level search can return the offset of the matched Struct element.",
                "section": "search",
                "page": 1,
                "quality_score": 0.95,
                "has_code": False,
                "emb_list_vector": [0.32, 0.14, 0.28, 0.41],
                "emb": [0.32, 0.14, 0.28, 0.41],
            }
        ],
    },
]

result = client.insert(
    collection_name="tech_articles",
    data=data,
)

print(result)

Insertar en campos StructArray nulos

Si el campo ` chunks ` es nulo, una entidad puede establecer todo el campo ` chunks ` en nulo. En Python, utilice ` None ` para representar un valor nulo.

client.insert(
    collection_name="tech_articles",
    data=[
        {
            "doc_id": 10,
            "title": "Article without chunks yet",
            "category": "draft",
            "title_vector": [0.05, 0.10, 0.15, 0.20],
            "chunks": None,
        }
    ],
)

Cuando un campo StructArray nulo contiene un valor StructArray válido, todos los subcampos de ese valor deben ser nulos o tener valores válidos. Insertar una entidad con algunos subcampos establecidos en nulo y otros en valores válidos da lugar a un error.

Advertencia Los campos StructArray nulos solo están disponibles en Milvus v3.0.x. Si añades dinámicamente un campo StructArray a una colección existente, el campo añadido debe ser nulo, y las entidades existentes deben devolver « null » para el nuevo campo en todos sus subcampos.

Validar los datos insertados

Puede consultar la colección y obtener el campo StructArray o los subcampos seleccionados.

rows = client.query(
    collection_name="tech_articles",
    filter="doc_id in [1, 2, 3]",
    output_fields=[
        "doc_id",
        "title",
        "chunks[text]",
        "chunks[section]",
        "chunks[quality_score]",
    ],
)

for row in rows:
    print(row)

Utilice rutas de campos StructArray, como chunks[text], únicamente al consultar, buscar, filtrar o crear índices. Las cargas útiles de inserción deben seguir utilizando objetos anidados bajo chunks.

Reglas de inserción

ReglaExplicación
Utilice una matriz de objetos para un campo StructArray.El valor de chunks es una lista, y cada elemento de la lista es un elemento Struct.
Utiliza nombres de subcampos dentro de cada elemento Struct.Inserta « {"text": "...", "emb": [...]} » dentro de « chunks », no en « {"chunks[text]": "..."} ».
Cumpla con el esquema de Struct.Cada elemento de Struct debe utilizar los subcampos definidos en el esquema de Struct.
Las dimensiones de los vectores deben coincidir.Los valores de los vectores deben coincidir con los « dim » configurados para sus subcampos vectoriales.
Respetar el « max_capacity ».El número de elementos Struct en una entidad no debe superar el número de elementos max_capacity del campo StructArray.
Utilice subcampos vectoriales independientes para los distintos modos de búsqueda.Si se requieren tanto la búsqueda en EmbeddingList como la búsqueda a nivel de elemento, escriba los valores vectoriales en ambos subcampos vectoriales.
Utilice « null » solo cuando el campo sea nulo.Los campos StructArray no nulos requieren valores StructArray válidos.

Errores comunes

  • Utilizar rutas de campo como « chunks[text] » en las cargas útiles de inserción.

  • Omitir subcampos obligatorios de un elemento Struct.

  • Insertar vectores con una dimensión incorrecta.

  • Insertar más elementos Struct de los que permite max_capacity.

  • Establecer solo un subcampo como « null », mientras que otros subcampos del mismo valor de StructArray son válidos.

  • Escribir vectores únicamente en ` emb_list_vector ` y, a continuación, intentar ejecutar una búsqueda a nivel de elemento en ` chunks[emb]`.

  • Escribir vectores únicamente en « emb » y, a continuación, intentar realizar una búsqueda en «EmbeddingList» en « chunks[emb_list_vector] ».

Próximos pasos

  1. Para crear índices para los subcampos « chunks[emb_list_vector] », « chunks[emb] » y los subcampos escalares, consulta «Indexar campos de StructArray».

  2. Para realizar búsquedas en subcampos vectoriales de StructArray, consulte «Búsqueda vectorial básica con StructArray».

  3. Para revisar el comportamiento de los valores nulos y las limitaciones específicas de cada versión, consulta «Límites de StructArray».

Traducido porDeepL

Prueba Milvus gestionado gratis

Zilliz Cloud no da problemas, funciona con Milvus y es 10 veces más rápido.

Empezar
Feedback

¿Fue útil esta página?