Criar e gerenciar um índice BM25

Este documento mostra como criar índices BM25 (Best Matching 25) para otimizar a pesquisa de texto completo no AlloyDB para PostgreSQL. Ele fornece exemplos de casos de uso comuns, incluindo pesquisas de classificação, configuração de parâmetros de saturação e ajuste de pesos de normalização.

O BM25 é um algoritmo de classificação probabilístico amplamente usado para estimar a relevância de um documento para uma determinada consulta. Ele avalia a frequência de termos (TF, na sigla em inglês), a frequência inversa de documentos (IDF, na sigla em inglês) e a normalização do comprimento do documento para oferecer classificações de pesquisa mais precisas do que a pesquisa de texto padrão.

Antes de começar

Para usar um índice BM25, ative a extensão pg_textsearch e atenda aos seguintes requisitos:

Ativar a extensão pg_textsearch

É necessário ativar a extensão pg_textsearch para cada banco de dados:

  1. Conecte-se ao banco de dados do AlloyDB usando psql ou outro cliente. Para mais informações, consulte Conectar-se a uma instância de cluster.
  2. Execute o comando SQL a seguir para criar a extensão:

    CREATE EXTENSION IF NOT EXISTS pg_textsearch;
    

Criar um índice BM25

O exemplo a seguir cria uma tabela chamada documents com uma column de conteúdo para indexar dados de texto para consultas de similaridade BM25.

  1. Crie uma tabela chamada documents:

    CREATE TABLE documents (
      id SERIAL PRIMARY KEY,
      title TEXT NOT NULL,
      content TEXT NOT NULL
    );
    
  2. Preencha a tabela com dados de amostra:

    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. Crie um índice BM25 na coluna content:

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

O índice oferece suporte a três parâmetros na cláusula WITH:

  • text_config (obrigatório): a configuração de pesquisa de texto do PostgreSQL a ser usada (por exemplo, english).
  • k1 (opcional): o parâmetro de saturação de frequência de termos. O valor padrão é 1.2.
  • b (opcional): o parâmetro de normalização do comprimento do documento. O valor padrão é 0.75.

Consultar usando um índice BM25

Para realizar a classificação de relevância em um índice BM25, use o <@> operador.

O operador <@> retorna uma pontuação BM25 negativa. Isso ocorre porque o PostgreSQL oferece suporte apenas a verificações de índice ascendentes (ASC) em operadores. Uma pontuação mais baixa (mais negativa) indica uma correspondência de relevância mais forte.

Execute uma consulta de pesquisa classificada por pontuação BM25 em ordem crescente:

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

A saída mostra o documento altamente relevante na parte de cima com a pontuação negativa mais baixa:

      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)

Ajustar parâmetros de índice BM25

É possível ajustar os parâmetros para otimizar a classificação de diferentes tipos de coleções de documentos.

  • Aumente k1: se você quiser que os termos de consulta sejam repetidos várias vezes para aumentar consistentemente a pontuação de um documento.
  • Aumente b: se você quiser que documentos mais longos sejam penalizados com mais intensidade por incluir termos diversos.

Para criar um índice personalizado para documentos curtos que priorizam a frequência de termos, defina k1 como 1.5 e b como 0.8:

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

A seguir