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:
- Usa PostgreSQL 17 o 18: La extensión
pg_textsearchsolo es compatible con las instancias de AlloyDB que ejecutan la versión principal 17 o 18 de PostgreSQL. - Rol de base de datos: Debes tener el rol de base de datos
alloydbsuperuser. Para obtener más información, consulta Agrega un usuario o una cuenta de servicio de IAM a un clúster.
Habilita la extensión pg_textsearch
Debes habilitar la extensión pg_textsearch para cada base de datos:
- Conéctate a tu base de datos de AlloyDB con
psqlo con otro cliente. Para obtener más información, consulta Conéctate a una instancia de clúster. 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.
Crea una tabla llamada
documents:CREATE TABLE documents ( id SERIAL PRIMARY KEY, title TEXT NOT NULL, content TEXT NOT NULL );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');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 es1.2.b(opcional): Es el parámetro de normalización de la longitud de los documentos. El valor predeterminado es0.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?
- Obtén información sobre la búsqueda de texto completo.
- Aprende a ejecutar una búsqueda híbrida de similitud de vectores.