lakebase_tokenizer

A lakebase_tokenizer extensão adiciona tokenização configurável de palavra inteira à pesquisa de texto completo do PostgreSQL no Lakebase. Configurações de pesquisa por texto construídas com a extensão funcionam com to_tsvector, o @@ operador, funções de classificação e índices GIN. Também podes usar os valores gerados tsvector com lakebase_text para o ranking do BM25.

A extensão fornece o tokenizer_wholeword modelo através da interface padrão de dicionário de pesquisa de texto do PostgreSQL. O template suporta conversão minúscula, normalização Unicode, remoção de acentos, remoção possessiva inglesa, palavras de parada personalizadas, sinónimos um-para-um e stemming inglês.

Install

Instale a extensão na sua base de dados. Os exemplos nesta página utilizam um esquema dedicado para tornar os objetos de extensão fáceis de identificar:

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

A extensão é realocável. Podes substituir tokenizer_ext por outro esquema quando o instalares.

Atualizar a extensão

Uma nova versão do Lakebase Search pode adicionar funcionalidades, 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 necessária do índice.

Início rápido com tokenizer_wholeword

O exemplo seguinte cria um dicionário a partir do tokenizer_wholeword modelo, depois mapeia tipos comuns de tokens PostgreSQL para ele numa configuração de pesquisa de 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, criar um índice GIN e executar 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 pesquisa de texto para documentos e consultas, de modo a que ambos os lados apliquem a mesma estratégia e opções de tokenização.

Modelo: tokenizer_wholeword

Como funciona

Para cada token passado para o dicionário pelo parser de pesquisa de texto do PostgreSQL, tokenizer_wholeword aplicam-se estas operações:

  1. Lowercase: Converter o token para minúsculas.
  2. Normalize: Aplicar a normalização Unicode.
  3. StripAccents: Remove os sotaques.
  4. EnglishPossessive: Remover um sufixo possessivo inglês quando resta pelo menos um carácter.
  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: Emitir a substituição configurada e parar o processamento se o token corresponder a um sinónimo.
  7. Stemmer: Se nenhum sinónimo for compatível e o stemming estiver ativado, aplicar o stemmer inglês.

Adicionar palavras de stop e sinónimos

O tokenizer_wholeword modelo pode carregar stop-words e sinónimos personalizados a partir de tabelas lakebase_tokenizer_stopwords SQL geridas por extensões e lakebase_tokenizer_synonyms. A name coluna agrupa as linhas num conjunto que selecionas com a Stopwords opção de dicionário.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 quando 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ónimo 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, por isso armazene-as exatamente na forma produzida por essas opções ativadas:

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

Os nomes dos conjuntos podem conter até 256 bytes. Palavras e sinónimos podem conter até 1024 bytes. Cada conjunto de palavra final ou sinónimo nomeado pode conter até 100.000 linhas.

Uma substituição de sinónimo é emitida exatamente como armazenada e não é processada pelo caule. Os sinónimos suportam uma substituição para cada palavra-fonte. Para representar uma substituição de múltiplas palavras como um lexema, use um separador como sublinhado, como em united_states.

Após alterar 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 esta opção inexistente, o que invalida a cache sem alterar nenhuma das opções configuradas pelo 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 à aplicação da administração do tokenizador:

  • app_role utiliza dicionários existentes. Precisa USAGE dos esquemas relevantes e SELECT das tabelas de catálogo de extensões, mas não precisa de possuir os dicionários.
  • tokenizer_admin gere conjuntos de palavras paradas e sinónimos, cria e possui dicionários e configurações de pesquisa de texto, e executa o comando reload após alterar 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 são armazenados dicionários e configurações de pesquisa de texto. Crie estes objetos como tokenizer_admin, ou transfira a 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 maiúsculas.

Option Tipo Predefinição Description
Lowercase boolean true Converte tokens para minúsculas antes de aplicar outras operações. Stemmer = 'english' requer Lowercase = 'true'.
Normalize NFC, NFD, NFKC, NFKDou none none Aplica o formulário selecionado de normalização Unicode. Isto canonicaliza a representação, mas não remove caracteres. Por exemplo, NFC torna pré-composto é e e seguido por um equivalente combinante de acento agudo.
EnglishPossessive boolean true Remove um elemento final 's, ’s, ou 's quando pelo menos um carácter precede o sufixo. Um sufixo independente mantém-se inalterado.
StripAccents boolean false Aplica a normalização NFKD e remove as marcas de combinação. Por exemplo, café passa a cafe. Quando esta opção estiver ativada, omita-a Normalize porque o passo NFKD torna redundante qualquer normalização Unicode separada.
Stopwords Nome do conjunto None Usa o conjunto nomeado de tokenizer_ext.lakebase_tokenizer_stopwords.
Synonyms Nome do conjunto None Utiliza o conjunto nomeado de substituições um-para-um de tokenizer_ext.lakebase_tokenizer_synonyms.
Stemmer english None Usa o stemmer inglês Snowball 3.1.0 incluído. Omita esta opção para desativar o stemming. O stemmer não inclui uma lista de palavra final.

Tabelas de catálogo

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

Usa o ranking BM25 com lakebase_text

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

Passos seguintes