lakebase_tokenizer

A lakebase_tokenizer extensão adiciona tokenização configurável de palavra inteira à busca de texto integral do PostgreSQL no Lakebase. Configurações de busca por texto construídas com a extensão trabalham com to_tsvector, o @@ operador, funções de ranking e índices GIN. Você também pode usar os valores gerados tsvector com lakebase_text para o ranking do BM25.

A extensão fornece o tokenizer_wholeword modelo por meio da interface padrão de dicionário de busca de texto do PostgreSQL. O template suporta conversão minúscula, normalização Unicode, remoção de acento, remoção possessiva em inglês, palavras de parada personalizadas, sinônimos um-para-um e stemming em inglês.

Install

Instale a extensão no seu banco de dados. Os exemplos nesta página usam um esquema dedicado para facilitar a identificação dos objetos de extensão:

CREATE SCHEMA IF NOT EXISTS tokenizer_ext;
CREATE EXTENSION IF NOT EXISTS lakebase_tokenizer WITH SCHEMA tokenizer_ext;

A extensão é realocável. Você pode substituir tokenizer_ext por outro esquema quando instalar.

Atualizar a extensão

Uma nova versão do Lakebase Search pode adicionar recursos, correções e melhorias de desempenho. O PostgreSQL não atualiza automaticamente a versão instalada da extensão. Verifique as versões instaladas e as mais recentes disponíveis:

SELECT installed_version, default_version
FROM pg_available_extensions
WHERE name = 'lakebase_tokenizer';

Atualize a extensão para a versão mais recente disponível:

ALTER EXTENSION lakebase_tokenizer UPDATE;

ALTER EXTENSION não regenera valores armazenados tsvector nem reconstrói GIN ou lakebase_bm25 índices dependentes. Se uma atualização alterar a saída da tokenização, regenere os valores armazenados tsvector e siga as notas de lançamento para qualquer manutenção de índice necessária.

Começo rápido com tokenizer_wholeword

O exemplo a seguir cria um dicionário a partir do tokenizer_wholeword modelo, depois mapeia tipos comuns de tokens PostgreSQL para ele em uma configuração de busca por texto:

CREATE TEXT SEARCH DICTIONARY documents_dict (
  TEMPLATE          = tokenizer_ext.tokenizer_wholeword,
  Lowercase         = 'true',
  StripAccents      = 'true',
  Stemmer           = 'english'
);

CREATE TEXT SEARCH CONFIGURATION documents_cfg (COPY = pg_catalog.simple);

ALTER TEXT SEARCH CONFIGURATION documents_cfg
  ALTER MAPPING FOR asciiword, word, numword, hword_numpart, hword_part, hword_asciipart
  WITH documents_dict;

Use a configuração para produzir um tsvector, crie um índice GIN e execute consultas em texto completo:

CREATE TABLE documents (
  id            BIGSERIAL PRIMARY KEY,
  body          TEXT NOT NULL,
  search_vector TSVECTOR GENERATED ALWAYS AS (
    to_tsvector('documents_cfg', body)
  ) STORED
);

INSERT INTO documents (body) VALUES
  ('Cats are running near the café.'),
  ('A dog is sleeping in the house.');

CREATE INDEX documents_search_idx ON documents USING gin (search_vector);

SELECT id, body
FROM documents
WHERE search_vector @@ plainto_tsquery('documents_cfg', 'running café');

Use a mesma configuração de busca por texto para documentos e consultas, de modo que ambos os lados apliquem a mesma estratégia e opções de tokenização.

Modelo: tokenizer_wholeword

Como funciona

Para cada token passado ao dicionário pelo parser de busca de texto do PostgreSQL, tokenizer_wholeword aplica-se as seguintes operações:

  1. Lowercase: Converta o token para minúscula.
  2. Normalize: Aplicar a normalização Unicode.
  3. StripAccents: Remova os sotaques.
  4. EnglishPossessive: Remover um sufixo possessivo inglês quando pelo menos um caractere permanecer.
  5. Stopwords: Não emita lexema e pare o processamento se o token corresponder a uma palavra de parada configurada. O token é omitido do gerado tsvector.
  6. Synonyms: Emita o substituto configurado e pare o processamento se o token corresponder a um sinônimo.
  7. Stemmer: Se nenhum sinônimo correspondido e stemming estiver ativado, aplique o stemmer inglês.

Adicionar palavras de som e sinônimos

O tokenizer_wholeword template pode carregar palavras de parada e sinônimos personalizados a partir de tabelas lakebase_tokenizer_stopwords SQL gerenciadas por extensões e lakebase_tokenizer_synonyms. A name coluna agrupa as linhas em um conjunto que você seleciona com a Stopwords opção de dicionário ou Synonyms .

INSERT INTO tokenizer_ext.lakebase_tokenizer_stopwords (name, word) VALUES
  ('app_stopwords', 'the'),
  ('app_stopwords', 'and'),
  ('app_stopwords', 'or');

INSERT INTO tokenizer_ext.lakebase_tokenizer_synonyms (name, word, synonym) VALUES
  ('app_synonyms', 'usa', 'united_states'),
  ('app_synonyms', 'uk', 'united_kingdom');

Consulte os conjuntos ao criar ou alterar um tokenizer_wholeword dicionário:

ALTER TEXT SEARCH DICTIONARY documents_dict (
  Stopwords = 'app_stopwords',
  Synonyms  = 'app_synonyms'
);

A extensão compara palavras de parada e palavras-fonte sinônimos com cada token após aplicar , , , e EnglishPossessive, mas antes de aplicar Stemmer. StripAccentsNormalizeLowercase As entradas do catálogo não são transformadas automaticamente, então armazene-as exatamente na forma produzida por essas opções habilitadas:

  • Com Lowercase = 'true', use entradas minúsculas. Com , a Lowercase = 'false'capitalização deve corresponder ao token.
  • Com ativado, armazene Normalize as entradas no formulário selecionado de normalização Unicode.
  • Com StripAccents = 'true', armazene a forma com acentuado removido. Por exemplo, armazene cafe para corresponder caféa .
  • Guarde o formulário antes de despedaçar. Por exemplo, com Stemmer = 'english', uma run entrada não corresponde runninga . Adicione running para filtrar ou substituir esse token.

Nomes de conjuntos podem conter até 256 bytes. Palavras e sinônimos podem conter até 1024 bytes. Cada conjunto de palavra parada nomeada ou sinônimo pode conter até 100.000 linhas.

Uma substituição de sinônimo é emitida exatamente como armazenada e não é processada pelo haste. Sinônimos suportam uma substituição para cada palavra-fonte. Para representar uma substituição multipalavra como um lexema, use um separador como um sublinhado, como em united_states.

Após mudar um conjunto, o proprietário de cada dicionário que faz referência ao conjunto deve executar um no-op ALTER TEXT SEARCH DICTIONARY para forçar uma recarga:

ALTER TEXT SEARCH DICTIONARY documents_dict (dummy);

A dummy opção não existe em tokenizer_wholeword. Omitir um valor pede ao PostgreSQL que remova essa opção inexistente, o que invalida o cache sem alterar nenhuma das opções configuradas do dicionário.

Após recarregar o dicionário, regenere os valores armazenados tsvector reescrevendo as linhas de origem:

UPDATE documents SET body = body;

Funções e acesso

Use dois papéis para separar o acesso de aplicações da administração do tokenizador:

  • app_role Utiliza dicionários já existentes. Ele precisa USAGE dos esquemas relevantes e SELECT das tabelas de catálogo de extensões, mas não precisa possuir os dicionários.
  • tokenizer_admin gerencia conjuntos de palavras paradas e sinônimos, cria e possui dicionários e configurações de busca de texto, e executa o comando reload após a alteração de um conjunto.

Conceda acesso ao esquema de extensão e às tabelas de catálogo:

GRANT USAGE ON SCHEMA tokenizer_ext TO app_role, tokenizer_admin;

GRANT SELECT ON
  tokenizer_ext.lakebase_tokenizer_stopwords,
  tokenizer_ext.lakebase_tokenizer_synonyms
TO app_role;

GRANT SELECT, INSERT, UPDATE, DELETE ON
  tokenizer_ext.lakebase_tokenizer_stopwords,
  tokenizer_ext.lakebase_tokenizer_synonyms
TO tokenizer_admin;

tokenizer_admin também necessidades CREATE no esquema onde dicionários e configurações de busca de texto são armazenados. Crie esses objetos como tokenizer_admin, ou transfira sua propriedade para eles. O acesso de escrita às tabelas de catálogo não concede a propriedade dos dicionários existentes.

Opções

Especifique tokenizer_wholeword opções em CREATE TEXT SEARCH DICTIONARY ou ALTER TEXT SEARCH DICTIONARY. Os nomes das opções são indiferentes a maiúsculas e minúsculas.

Opção Tipo Default Description
Lowercase booleano true Converte tokens para minúsculas antes de aplicar outras operações. Stemmer = 'english' requer Lowercase = 'true'.
Normalize NFC, NFD, NFKC, NFKD ou none none Aplica o formulário selecionado de normalização Unicode. Isso canoniciza a representação, mas não remove caracteres. Por exemplo, NFC faz pré-composto é e e seguido por um equivalente combinando acento agudo.
EnglishPossessive booleano true Remove um elemento final 's, ’s, ou 's quando pelo menos um caractere precede o sufixo. Um sufixo independente permanece inalterado.
StripAccents booleano false Aplica normalização NFKD e remove marcas de combinação. Por exemplo, café se tornará cafe. Quando essa opção estiver ativada, omita Normalize porque o passo NFKD torna qualquer normalização Unicode separada redundante.
Stopwords Nome do conjunto None Usa o conjunto nomeado de tokenizer_ext.lakebase_tokenizer_stopwords.
Synonyms Nome do conjunto None Usa o conjunto nomeado de substitutos um-para-um de tokenizer_ext.lakebase_tokenizer_synonyms.
Stemmer english None Usa o stemmer inglês Snowball 3.1.0 incluído. Omita essa opção para desabilitar o stemming. O stemmer não inclui uma lista de palavras finales.

Tabelas de catálogo

Tabela Columns Description
lakebase_tokenizer_stopwords name text, word text Lojas nomearam conjuntos de palavras finais para templates tokenizadores que suportam Stopwords. A chave primária é (name, word).
lakebase_tokenizer_synonyms name text, word text, synonym text Lojas nomearam substitutos um-para-um para modelos de tokenizador que suportam Synonyms. A chave primária é (name, word).

Use o ranking BM25 com lakebase_text

Configurações de busca por texto construídas com lakebase_tokenizer produzem valores padrão PostgreSQL tsvector compatíveis com lakebase_text. Para usar a classificação de relevância do BM25 e a recuperação top-K, crie um lakebase_bm25 índice na mesma tsvector coluna. Para sintaxe de instalação, criação de índice e consulta, veja lakebase_text.

Próximas Etapas