Crea y administra un índice de BM25

En este documento, se muestra cómo crear índices BM25 (Best Matching 25) para optimizar la búsqueda de texto completo en AlloyDB para PostgreSQL. Se proporcionan ejemplos para casos de uso comunes, como la clasificación de búsquedas, la configuración de parámetros de saturación y el ajuste de pesos de normalización.

BM25 es un algoritmo de clasificación probabilístico que se usa ampliamente para estimar la relevancia de un documento para una consulta determinada. Evalúa la frecuencia de términos (TF), la frecuencia inversa de documentos (IDF) y la normalización de la longitud de los documentos para ofrecer clasificaciones de búsqueda más precisas que la búsqueda de texto estándar.

Antes de comenzar

Para usar un índice BM25, debes habilitar la extensión pg_textsearch y cumplir con los siguientes requisitos:

Habilita la extensión pg_textsearch

Debes habilitar la extensión pg_textsearch para cada base de datos:

  1. Conéctate a tu base de datos de AlloyDB con psql o con otro cliente. Para obtener más información, consulta Conéctate a una instancia de clúster.
  2. Ejecuta el siguiente comando SQL para crear la extensión:

    CREATE EXTENSION IF NOT EXISTS pg_textsearch;
    

Crea un índice BM25

En el siguiente ejemplo, se crea una tabla llamada documents con una column de contenido para indexar datos de texto para consultas de similitud de BM25.

  1. Crea una tabla llamada documents:

    CREATE TABLE documents (
      id SERIAL PRIMARY KEY,
      title TEXT NOT NULL,
      content TEXT NOT NULL
    );
    
  2. Propaga la tabla con los datos de muestra:

    INSERT INTO documents (title, content) VALUES
      ('Database systems', 'AlloyDB is a fully managed PostgreSQL-compatible database service'),
      ('Google Cloud FTS', 'Full-text search lets you identify natural-language documents'),
      ('Probabilistic Ranking', 'BM25 uses term frequency and document length normalization');
    
  3. Crea un índice BM25 en la columna content:

    CREATE INDEX idx_docs_bm25
    ON documents
    USING bm25 (content)
    WITH (text_config = 'english');
    

El índice admite tres parámetros en su cláusula WITH:

  • text_config (obligatorio): Es la configuración de búsqueda de texto de PostgreSQL que se usará (por ejemplo, english).
  • k1 (opcional): Es el parámetro de saturación de frecuencia de términos. El valor predeterminado es 1.2.
  • b (opcional): Es el parámetro de normalización de la longitud de los documentos. El valor predeterminado es 0.75.

Realiza consultas con un índice BM25

Para realizar una clasificación de relevancia en un índice BM25, usa el <@> operador.

El operador <@> muestra una puntuación BM25 negativa. Esto se debe a que PostgreSQL solo admite análisis de índice ascendentes (ASC) en operadores. Una puntuación más baja (más negativa) indica una coincidencia de relevancia más sólida.

Ejecuta una consulta de búsqueda ordenada por puntuación BM25 en orden ascendente:

SELECT title, content, content <@> 'database system' AS score
FROM documents
ORDER BY content <@> 'database system' ASC
LIMIT 5;

El resultado muestra el documento altamente relevante en la parte superior con la puntuación negativa más baja:

      title       |                            content                                   |  score
------------------+----------------------------------------------------------------------+----------
 Database systems | AlloyDB is a fully managed PostgreSQL-compatible database service    | -0.9971461892127991
 Google Cloud FTS | Full-text search lets you identify natural-language documents        | 0
 Probabilistic ranking | BM25 uses term frequency and document length normalization      | 0
(3 rows)

Ajusta los parámetros del índice BM25

Puedes ajustar los parámetros para optimizar la clasificación de diferentes tipos de colecciones de documentos.

  • Aumenta k1: Si deseas que los términos de consulta se repitan varias veces para aumentar de manera coherente la puntuación de un documento.
  • Aumenta b: Si deseas que los documentos más largos se penalicen más por incluir términos diversos.

Para crear un índice personalizado para documentos cortos que prioricen la frecuencia de términos, establece k1 en 1.5 y b en 0.8:

CREATE INDEX idx_docs_bm25_tuned
ON documents
USING bm25 (content)
WITH (text_config = 'english', k1 = 1.5, b = 0.8);

¿Qué sigue?