Campo de textoCompatible with Milvus 3.0.x

En las aplicaciones de búsqueda con IA, la búsqueda vectorial ayuda a encontrar entidades semánticamente similares, pero la aplicación a menudo también necesita el texto original de cada coincidencia. Un modelo de lenguaje grande (LLM) o un agente puede utilizar ese texto como contexto para leer, citar, resumir o incluir el resultado en una solicitud.

Milvus proporciona el tipo de campo escalar « TEXT » para almacenar texto fuente extenso directamente con las entidades. Entre los valores típicos se incluyen pasajes, documentos largos, cuerpos de artículos, tickets y registros. A diferencia de « VARCHAR », que requiere una longitud máxima fija de bytes ( max_length), « TEXT » no exige establecer una longitud máxima de bytes en el esquema de la colección.

Para definir un campo « TEXT », establezca « datatype » en « DataType.TEXT ».

Esta función requiere Storage V3. Para obtener instrucciones de activación y consideraciones de compatibilidad, consulta Storage V3.

common.storage.useLoonFFI El valor por defecto es « false », lo que significa que Storage V3 está desactivado de forma predeterminada. Antes de crear una colección que contenga un campo « TEXT », establezca este parámetro en « true »; de lo contrario, Milvus rechazará el esquema de la colección.

schema.add_field(
    field_name="content",
    datatype=DataType.TEXT,
)

Una vez definido el campo, cada entidad puede incluir un valor de cadena en dicho campo. Los valores de « TEXT » se insertan como cualquier otro campo escalar y se devuelven en los resultados de consultas o búsquedas al incluir el campo en « output_fields ».

TEXT Los campos admiten valores nulos. Para habilitar esta función, establezc nullable en True. Para obtener más detalles, consulte «Campo nulo».

Restricciones

  • Un campo « TEXT » no puede ser un campo primario, una clave de partición ni una clave de agrupamiento.
  • TEXT No se puede utilizar como tipo de elemento de un campo « ARRAY », incluido un subcampo escalar en un « StructArray ».
  • En Milvus 3.0.0, los campos « TEXT » no admiten valores por defecto.
  • En Milvus 3.0.0, los campos « TEXT » no son compatibles con colecciones externas.
  • Los usuarios no pueden crear un índice escalar en un campo « TEXT ». Cuando se utiliza « enable_match=True », Milvus crea un índice de texto gestionado por el sistema para la coincidencia de texto. Este índice interno no es un índice escalar creado por el usuario.
  • Los operadores de filtro escalar generales no se pueden aplicar directamente a un campo « TEXT ». Entre ellos se incluyen operadores de comparación como « == » y « != », operadores de rango como « > », « >= », « < » y « <= », así como « IN », « LIKE », operadores de expresiones regulares (=~ y !~) y « IS NULL » o « IS NOT NULL ». Para filtrar por términos analizados, defina el campo con « enable_analyzer=True » y « enable_match=True », y utilice «TEXT_MATCH » o « TEXT_MATCH_FUZZY ». Para la recuperación de texto completo ordenada por relevancia, utilice BM25.
  • En Milvus 3.0.0, es necesario definir una función BM25 o MinHash que utilice un campo « TEXT » como entrada al crear la colección. No se puede añadir posteriormente mediante add_function_field o AlterCollectionSchema, ni siquiera si la colección existente está vacía, ya que Milvus no puede completar retrospectivamente la salida de la función a partir de los valores almacenados en « TEXT ». Para añadir dicha «Function» a una colección existente, utilice un campo de entrada « VARCHAR » o vuelva a crear la colección incluyendo la «Function» en su esquema. Para obtener más detalles sobre cómo añadir una «Function» y su campo vectorial generado, consulte «Alter Collection Schema».
  • Las funciones de incrustación de texto también deben definirse al crear la colección. Milvus 3.0.0 no admite su adición en tiempo de ejecución.

Elija TEXT o VARCHAR

TEXT y « VARCHAR » almacenan valores de cadena, pero satisfacen necesidades de aplicación diferentes. Utiliza « VARCHAR » para metadatos breves y delimitados que identifican, categorizan o filtran entidades. Utiliza « TEXT » para contenido de origen más extenso que proporcione a un LLM o a un agente suficiente contexto para leer, citar, resumir o crear una indicación.

AspectoVARCHARTEXT
Ideal paraMetadatos breves utilizados para identificar, categorizar o filtrar entidades, como title, tag, category o external_id.Contenido de origen más extenso utilizado por flujos de trabajo de modelos de lenguaje grande (LLM) o de agentes, como content, passage, article_body o log_message.
Configuración de longitudRequiere max_length, que define el número máximo de bytes que puede almacenar el campo. El valor máximo es 65,535 bytes. Si un valor puede superar este límite, utilice TEXT.No requiere max_length, por lo que el esquema no necesita un límite fijo de bytes para el valor de texto.
Comportamiento de almacenamientoAlmacena cada valor dentro del límite de bytes configurado para el campo ( max_length).Utiliza la selección automática de almacenamiento para valores de texto más grandes. Para obtener más información, consulta «Cómo almacena Milvus los valores TEXT de gran tamaño».
Compatibilidad con campos primariosSe puede utilizar como campo primario.No se puede utilizar como campo primario.
FiltradoSe utiliza para metadatos de cadenas cortas que deben aparecer en expresiones de filtro, como category == "news" o tag in ["ai", "database"].No admite operadores de filtro escalares generales. Utilice operadores de texto con coincidencia habilitada para el filtrado de términos analizados, o BM25 para la recuperación de texto completo clasificada por relevancia.

Para obtener más información sobre los campos « VARCHAR », consulte el campo VarChar.

Cómo almacena Milvus los valores TEXT de gran tamaño

Expandir para ver cómo funciona

Al insertar una entidad, la cadena que se proporciona para un campo « TEXT » es el valor « TEXT ». Milvus compara el tamaño de ese valor con «dataNode.text.inlineThreshold», que por defecto es de 65,536 bytes, y a continuación elige una de las dos rutas de almacenamiento interno.

Large text storage Almacenamiento de texto de gran tamaño

  • Almacenamiento en línea: si el valor de « TEXT » es menor que « dataNode.text.inlineThreshold », Milvus almacena el valor de texto original directamente en los datos del campo « TEXT ».
  • Almacenamiento LOB: si un valor de « TEXT » es mayor o igual que « dataNode.text.inlineThreshold », Milvus trata el valor como un objeto de gran tamaño y almacena el texto original por separado en un almacenamiento de objetos, como MinIO. El campo « TEXT » almacena una referencia interna al texto almacenado por separado. Cuando se solicita el campo « TEXT » en los resultados de una consulta o búsqueda, Milvus utiliza la referencia para recuperar y devolver el texto original.

Esta selección de almacenamiento es interna. La inserción, consulta y búsqueda en el campo « TEXT » se realizan de la misma manera, independientemente de la ruta de almacenamiento que utilice Milvus. Para ajustar el umbral o el comportamiento relacionado con el almacenamiento, la compactación y la recolección de basura, consulta las configuraciones relacionadas con dataNode y las configuraciones relacionadas con dataCoord.

Si su implementación utiliza almacenamiento de objetos, los valores grandes de « TEXT » pueden aparecer como objetos gestionados por Milvus en rutas como lobs/.... Estos objetos son detalles de implementación y no deben moverse, copiarse ni eliminarse manualmente. Tras eliminar entidades, suprimir particiones o compactar datos, el uso del almacenamiento de objetos puede reducirse solo después de que la recolección de basura de Milvus elimine los datos de objetos grandes sin referencias una vez transcurrido su periodo de seguridad.

Un uso habitual de TEXT es la búsqueda de texto completo con BM25. En este patrón, el campo TEXT almacena el contenido original de la fuente, y BM25 analiza el texto y genera vectores dispersos para clasificar las coincidencias basadas en palabras clave. Los resultados de la búsqueda pueden devolver entonces el valor TEXT coincidente como contexto para flujos de trabajo de LLM o de agentes. El siguiente ejemplo muestra cómo utilizar un campo « TEXT » como campo de entrada para BM25. Para obtener más información sobre los conceptos y las opciones de consulta de la búsqueda de texto completo, consulta Búsqueda de texto completo.

Paso 1: Crear una colección con un campo TEXT

El siguiente ejemplo crea una colección con un campo « TEXT » para el contenido de origen y un campo de vectores dispersos para los vectores dispersos generados por BM25. La función BM25 convierte el texto tokenizado de « content » en vectores dispersos almacenados en « sparse ».

Para la búsqueda de texto completo con BM25, el campo de entrada « TEXT » debe estar configurado en « enable_analyzer=True ».

from pymilvus import DataType, Function, FunctionType, MilvusClient

client = MilvusClient(uri="http://localhost:19530")
COLLECTION_NAME = "text_bm25_collection"

if client.has_collection(COLLECTION_NAME):
    client.drop_collection(COLLECTION_NAME)

schema = client.create_schema(auto_id=False, enable_dynamic_field=False)
schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)
schema.add_field(
    field_name="content",
    datatype=DataType.TEXT,
    enable_analyzer=True,
)
schema.add_field(field_name="sparse", datatype=DataType.SPARSE_FLOAT_VECTOR)

bm25_function = Function(
    name="content_bm25",
    input_field_names=["content"],
    output_field_names=["sparse"],
    function_type=FunctionType.BM25,
)
schema.add_function(bm25_function)

Paso 2: Crear un índice de vectores dispersos

Crea un índice en el campo de vectores dispersos generado por la función BM25. El tipo de métrica debe establecerse en BM25.

index_params = client.prepare_index_params()
index_params.add_index(
    field_name="sparse",
    index_type="SPARSE_INVERTED_INDEX",
    metric_type="BM25",
    params={
        "inverted_index_algo": "DAAT_MAXSCORE",
        "bm25_k1": 1.2,
        "bm25_b": 0.75,
    },
)

client.create_collection(
    collection_name=COLLECTION_NAME,
    schema=schema,
    index_params=index_params,
)

Paso 3: Insertar datos de TEXTO

Inserta el texto directamente en el campo « TEXT ». No introduzcas valores en el campo « sparse ». Milvus genera los vectores dispersos internamente aplicando la función BM25 a « content ».

data = [
    {
        "id": 1,
        "content": "Milvus stores vector embeddings and scalar fields in collections. It supports vector search, full text search, and metadata filtering for retrieval applications.",
    },
    {
        "id": 2,
        "content": "Long documents are often split into passages before embedding. Store each passage in a TEXT field so search results can return the source text.",
    },
    {
        "id": 3,
        "content": "Operational logs and support tickets often contain long natural-language text. TEXT fields can store these values without a fixed max_length setting.",
    },
]

client.insert(collection_name=COLLECTION_NAME, data=data)
client.load_collection(collection_name=COLLECTION_NAME)

Utilice el texto de la consulta sin procesar como datos de búsqueda y realice la búsqueda en el campo de vectores dispersos. Milvus convierte el texto de la consulta en un vector disperso, clasifica los resultados con BM25 y devuelve el campo « TEXT » solicitado en « output_fields ».

results = client.search(
    collection_name=COLLECTION_NAME,
    data=["how does Milvus store source text for retrieval"],
    anns_field="sparse",
    limit=2,
    output_fields=["content"],
)

Paso 5: Leer los valores TEXT devueltos

Cada resultado de la búsqueda incluye la puntuación BM25 y el valor original de « TEXT ».

for hit in results[0]:
    print(f"id: {hit['id']}, score: {hit['distance']}")
    print(hit["entity"]["content"])

Para obtener más información sobre las funciones de BM25, los índices de vectores dispersos y la sintaxis de consulta para la búsqueda de texto completo, consulte Búsqueda de texto completo.