Concordancia de frasesCompatible with Milvus 2.5.17+

La concordancia de frases permite buscar documentos que contengan los términos de la consulta como una frase exacta. Por defecto, las palabras deben aparecer en el mismo orden y directamente adyacentes entre sí. Por ejemplo, una búsqueda de "robótica y aprendizaje automático" coincide con texto como "...modelos típicos de robótica y aprendizaje automático...", donde las palabras "robótica", "máquina" y "aprendizaje" aparecen en secuencia sin ninguna otra palabra entre ellas.

Sin embargo, en situaciones reales, la concordancia estricta de frases puede ser demasiado rígida. Por ejemplo, puede buscar un texto como "...modelos de aprendizaje automático ampliamente adoptados en robótica...". En este caso, las mismas palabras clave están presentes pero no una al lado de la otra ni en el orden original. Para ello, la concordancia de frase admite el parámetro slop, que introduce flexibilidad. El valor slop define cuántos cambios de posición se permiten entre los términos de la frase. Por ejemplo, con un valor de 1 en slop, una consulta sobre "aprendizaje automático" puede coincidir con un texto como "...aprendizaje automático profundo...", en el que una palabra ("profundo") separa los términos originales.

Resumen

Gracias a la biblioteca del motor de búsqueda Tantivy, la concordancia de frases funciona analizando la información posicional de las palabras dentro de los documentos. El diagrama siguiente ilustra el proceso:

Phrase Match Workflow Flujo de trabajo de la concordancia de frases

  1. Tokenización de documentos: Cuando inserta documentos en Milvus, el texto se divide en tokens (palabras o términos individuales) utilizando un analizador, con información posicional registrada para cada token. Por ejemplo, doc_1 se tokeniza en ["máquina" (pos=0), "aprendizaje" (pos=1), "potencia" (pos=2), "eficiencia" (pos=3)]. Para obtener más información sobre los analizadores, consulte Visión general de los analizadores.

  2. Creación de índices invertidos: Milvus construye un índice invertido, asignando cada token al documento o documentos en los que aparece y las posiciones del token en esos documentos.

  3. Correspondencia de frases: Cuando se ejecuta una consulta de frases, Milvus busca cada token en el índice invertido y comprueba sus posiciones para determinar si aparecen en el orden y la proximidad correctos. El parámetro slop controla el número máximo de posiciones permitidas entre tokens coincidentes:

    • slop = 0 significa que los tokens deben aparecer en el orden exacto e inmediatamente adyacentes (es decir, sin palabras extra entre ellos).

      • En el ejemplo, sólo doc_1 ("máquina" en pos=0, "aprendizaje" en pos=1) coincide exactamente.
    • slop = 2 permite hasta dos posiciones de flexibilidad o reordenación entre los tokens coincidentes.

      • Esto permite invertir el orden ("learning machine") o dejar un pequeño espacio entre las palabras.

      • En consecuencia, doc_1, doc_2 ("aprendizaje" en pos=0, "máquina" en pos=1) y doc_3 ("aprendizaje" en pos=1, "máquina" en pos=2) coinciden.

Activar la concordancia de frases

La concordancia de frase funciona con el tipo de campo VARCHAR, el tipo de datos de cadena en Milvus. Para activar la concordancia de frases, configure el esquema de su colección estableciendo los parámetros enable_analyzer y enable_match en True, de forma similar a la concordancia de texto.

Configure enable_analyzer y enable_match

Para habilitar la concordancia de frases para un campo VARCHAR específico, establezca los parámetros enable_analyzer y enable_match en True al definir el esquema del campo. Esta configuración indica a Milvus que tokenice el texto y cree un índice invertido con la información posicional necesaria para una concordancia de frase eficaz.

A continuación se muestra un ejemplo de definición de esquema para activar la concordancia de frases:

from pymilvus import MilvusClient, DataType

# Create a schema for a new collection
schema = MilvusClient.create_schema(enable_dynamic_field=False)
schema.add_field(
    field_name="id",
    datatype=DataType.INT64,
    is_primary=True,
    auto_id=True
)
# Add a VARCHAR field configured for phrase matching
schema.add_field(
    field_name='text',                 # Name of the field
    datatype=DataType.VARCHAR,         # Field data type set as VARCHAR (string)
    max_length=1000,                   # Maximum length of the string
    enable_analyzer=True,              # Enables text analysis (tokenization)
    enable_match=True                  # Enables inverted indexing for phrase matching
)
schema.add_field(
    field_name="embeddings",
    datatype=DataType.FLOAT_VECTOR,
    dim=5
)

Opcional: Configurar un analizador

La precisión de la concordancia de frases depende en gran medida del analizador utilizado para tokenizar sus datos de texto. Diferentes analizadores se adaptan a diferentes idiomas y formatos de texto, lo que afecta a la tokenización y a la precisión posicional. La selección de un analizador adecuado para su caso de uso específico optimizará los resultados de la concordancia de frases.

Por defecto, Milvus utiliza el analizador estándar, que tokeniza el texto basándose en los espacios en blanco y la puntuación, elimina los tokens de más de 40 caracteres y convierte el texto a minúsculas. No se requieren parámetros adicionales para el uso por defecto. Consulte Analizador estándar para obtener más información.

Si su aplicación requiere un analizador específico, configúrelo utilizando el parámetro analyzer_params. Por ejemplo, aquí se explica cómo configurar el analizador english para la concordancia de frases en texto inglés:

# Define analyzer parameters for English-language tokenization
analyzer_params = {
    "type": "english"
}

# Add the VARCHAR field with the English analyzer enabled
schema.add_field(
    field_name='text',                 # Name of the field
    datatype=DataType.VARCHAR,         # Field data type set as VARCHAR
    max_length=1000,                   # Maximum length of the string
    enable_analyzer=True,              # Enables text analysis
    analyzer_params=analyzer_params,   # Specifies the analyzer configuration
    enable_match=True                  # Enables inverted indexing for phrase matching
)

Milvus admite varios analizadores adaptados a diferentes idiomas y casos de uso. Para obtener información detallada, consulte Visión general de los analizadores.

Utilizar la concordancia de frases

Una vez que haya habilitado la concordancia para un campo VARCHAR en su esquema de recopilación, puede realizar concordancias de frases utilizando la expresión PHRASE_MATCH.

La expresión PHRASE_MATCH no distingue entre mayúsculas y minúsculas. Puede utilizar PHRASE_MATCH o phrase_match.

Sintaxis de la expresión PHRASE_MATCH

Utilice la expresión PHRASE_MATCH para especificar el campo, la frase y la flexibilidad opcional (slop) durante la búsqueda. La sintaxis es

PHRASE_MATCH(field_name, phrase, slop)
  • field_name: El nombre del campo VARCHAR en el que se realizan las coincidencias de frase.

  • phrase: La frase exacta que se va a buscar.

  • slop (opcional): Un número entero que especifica el número máximo de posiciones permitidas en los tokens coincidentes.

    • 0 (por defecto): Coincide sólo con frases exactas. Ejemplo: Un filtro para "machine learning" coincidirá exactamente con "machine learning", pero no con "machine boosts learning" o "learning machine".

    • 1: Permite pequeñas variaciones, como un término adicional o un pequeño cambio de posición. Ejemplo: Un filtro para "machine learning " coincidirá con "machine boosts learning" (un token entre "machine" y "learning") pero no con " learning machine" (términos invertidos).

    • 2: Permite una mayor flexibilidad, incluido el orden inverso de los términos o hasta dos tokens entre ellos. Ejemplo: Un filtro para "machine learning" coincidirá con "learning machine" (términos invertidos) o "machine quickly boosts learning" (dos tokens entre "machine" y "learning").

Ejemplo de conjunto de datos

Suponga que tiene una colección llamada tech_articles que contiene las cinco entidades siguientes:

doc_id

text

1

"El aprendizaje automático potencia la eficiencia en el análisis de datos a gran escala"

2

"El aprendizaje automático es vital para el progreso moderno de la IA"

3

"Las arquitecturas de máquinas de aprendizaje profundo optimizan las cargas computacionales"

4

"La máquina mejora rápidamente el rendimiento del modelo para el aprendizaje continuo"

5

"El aprendizaje de algoritmos de máquina avanzados amplía las capacidades de la IA"

Consulta con concordancia de frase

Cuando se utiliza el método query(), PHRASE_MATCH actúa como un filtro escalar. Sólo se devuelven los documentos que contienen la frase especificada (con el margen de error permitido).

Ejemplo: slop = 0 (coincidencia exacta)

Este ejemplo devuelve los documentos que contengan la frase exacta "aprendizaje automático" sin ningún token adicional en medio.

# Match documents containing exactly "machine learning"
filter = "PHRASE_MATCH(text, 'machine learning')"

result = client.query(
    collection_name="tech_articles",
    filter=filter,
    output_fields=["id", "text"]
)

Resultados esperados:

doc_id

text

1

"El aprendizaje automático aumenta la eficacia del análisis de datos a gran escala"

Sólo el documento 1 contiene la frase exacta "aprendizaje automático" en el orden especificado, sin elementos adicionales.

Búsqueda con concordancia de frase

En las operaciones de búsqueda, PHRASE_MATCH se utiliza para filtrar los documentos antes de aplicar la clasificación por similitud vectorial. Este enfoque en dos pasos reduce primero el conjunto de candidatos mediante la concordancia textual y, a continuación, vuelve a clasificar esos candidatos basándose en la incrustación vectorial.

Ejemplo: inclinación = 1

Aquí permitimos un slop de 1. El filtro se aplica a los documentos que contienen la frase "learning machine" con una ligera flexibilidad.

# Example: Filter documents containing "learning machine" with slop=1
filter_slop1 = "PHRASE_MATCH(text, 'learning machine', 1)"

result_slop1 = client.search(
    collection_name="tech_articles",
    anns_field="embeddings",
    data=[query_vector],
    filter=filter_slop1,
    search_params={"params": {"nprobe": 10}},
    limit=10,
    output_fields=["id", "text"]
)

Resultados:

doc_id

text

2

"El aprendizaje de una máquina es vital para el progreso moderno de la IA"

3

"Las arquitecturas de máquinas de aprendizaje profundo optimizan las cargas computacionales"

5

"El aprendizaje de algoritmos de máquina avanzados amplía las capacidades de la IA"

Ejemplo: slop = 2

Este ejemplo permite un slop de 2, lo que significa que se permiten hasta dos tokens adicionales (o términos invertidos) entre las palabras "máquina" y "aprendizaje".

# Example: Filter documents containing "machine learning" with slop=2
filter_slop2 = "PHRASE_MATCH(text, 'machine learning', 2)"

result_slop2 = client.search(
    collection_name="tech_articles",
    anns_field="embeddings",             # Vector field name
    data=[query_vector],                 # Query vector
    filter=filter_slop2,                 # Filter expression
    search_params={"params": {"nprobe": 10}},
    limit=10,                            # Maximum results to return
    output_fields=["id", "text"]
)

Resultado:

doc_id

text

1

"El aprendizaje automático aumenta la eficiencia en el análisis de datos a gran escala"

3

"Las arquitecturas de máquinas de aprendizaje profundo optimizan las cargas computacionales"

Ejemplo: slop = 3

En este ejemplo, un slop de 3 proporciona aún más flexibilidad. El filtro busca "aprendizaje automático" con un máximo de tres posiciones de token permitidas entre las palabras.

# Example: Filter documents containing "machine learning" with slop=3
filter_slop3 = "PHRASE_MATCH(text, 'machine learning', 3)"

result_slop2 = client.search(
    collection_name="tech_articles",
    anns_field="embeddings",             # Vector field name
    data=[query_vector],                 # Query vector
    filter=filter_slop3,                 # Filter expression
    search_params={"params": {"nprobe": 10}},
    limit=10,                            # Maximum results to return
    output_fields=["id", "text"]
)

Resultado de la búsqueda:

doc_id

text

1

"El aprendizaje automático aumenta la eficiencia en el análisis de datos a gran escala"

2

"El aprendizaje automático es vital para el progreso moderno de la IA"

3

"Las arquitecturas de máquinas de aprendizaje profundo optimizan las cargas computacionales"

5

"El aprendizaje de algoritmos de máquina avanzados amplía las capacidades de la IA"

Consideraciones

  • La activación de la concordancia de frases para un campo desencadena la creación de un índice invertido, que consume recursos de almacenamiento. Tenga en cuenta el impacto en el almacenamiento cuando decida activar esta función, ya que varía en función del tamaño del texto, los tokens únicos y el analizador utilizado.

  • Una vez que haya definido un analizador en su esquema, su configuración será permanente para esa colección. Si decide que un analizador diferente se adapta mejor a sus necesidades, puede considerar eliminar la colección existente y crear una nueva con la configuración de analizador deseada.

  • El rendimiento de la concordancia de frases depende de cómo se tokenice el texto. Antes de aplicar un analizador a toda la colección, utilice el método run_analyzer para revisar el resultado de la tokenización. Para obtener más información, consulte Descripción general del analizador.

  • Reglas de escape en expresiones filter:

    • Los caracteres entre comillas dobles o simples dentro de expresiones se interpretan como constantes de cadena. Si la constante de cadena incluye caracteres de escape, éstos deben representarse con una secuencia de escape. Por ejemplo, utilice \\ para representar \, \\t para representar un tabulador \t y \\n para representar una nueva línea.

    • Si una constante de cadena está encerrada entre comillas simples, una comilla simple dentro de la constante debe representarse como \\' mientras que una comilla doble puede representarse como " o \\". Ejemplo: 'It\\'s milvus'.

    • Si una constante de cadena está entre comillas dobles, una comilla doble dentro de la constante debe representarse como \\" mientras que una comilla simple puede representarse como ' o \\'. Ejemplo: "He said \\"Hi\\"".