lakebase_tokenizer

L'estensione lakebase_tokenizer aggiunge una tokenizzazione configurabile per intera parola alla ricerca full-text di PostgreSQL su Lakebase. Le configurazioni di ricerca testuale costruite con l'estensione lavorano con to_tsvector, l'operatore @@ , le funzioni di ranking e gli indici GIN. Puoi anche usare i valori generati tsvector con lakebase_text per il ranking BM25.

L'estensione fornisce il tokenizer_wholeword template tramite l'interfaccia standard del dizionario di ricerca testuale di PostgreSQL. Il template supporta la conversione minuscola, la normalizzazione Unicode, la rimozione dell'accento, la rimozione possessiva inglese, le parole di stop personalizzate, sinonimi uno a uno e lo stemming inglese.

Install

Installa l'estensione nel tuo database. Gli esempi in questa pagina utilizzano uno schema dedicato per rendere gli oggetti di estensione facili da identificare:

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

L'estensione è spostabile. Puoi sostituirlo tokenizer_ext con un altro schema quando lo installi.

Aggiornare l'estensione

Una nuova versione di Lakebase Search può aggiungere funzionalità, correzioni e miglioramenti delle prestazioni. PostgreSQL non aggiorna automaticamente la versione installata dell'estensione. Controlla le versioni installate e le più recenti disponibili:

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

Aggiorna l'estensione all'ultima versione disponibile:

ALTER EXTENSION lakebase_tokenizer UPDATE;

ALTER EXTENSION non rigenera i valori memorizzati tsvector né ricostruisce GIN o lakebase_bm25 indici dipendenti. Se un aggiornamento modifica l'output di tokenizzazione, rigenerare i valori memorizzati tsvector e rispettare le note di rilascio per eventuali riserve di manutenzione dell'indice.

Inizio rapido con tokenizer_wholeword

Il seguente esempio crea un dizionario dal tokenizer_wholeword template, poi mappa i tipi comuni di token PostgreSQL ad esso in una configurazione di ricerca testuale:

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;

Usa la configurazione per produrre un tsvector, crea un indice GIN ed esegui query full-text:

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é');

Usa la stessa configurazione di ricerca testuale per documenti e query, così che entrambe le parti applichino la stessa strategia e opzioni di tokenizzazione.

Modello: tokenizer_wholeword

Come funziona

Per ogni token passato al dizionario dal parser di ricerca testuale di PostgreSQL, tokenizer_wholeword applica queste operazioni:

  1. Lowercase: Converti il token in minuscolo.
  2. Normalize: Applicare la normalizzazione Unicode.
  3. StripAccents: Rimuovere gli accenti.
  4. EnglishPossessive: Rimuovere un suffisso possessivo inglese quando rimane almeno un carattere.
  5. Stopwords: Non emettere lexema e interrompere l'elaborazione se il token corrisponde a una parola di arresto configurata. Il token viene omesso dal generatore tsvector.
  6. Synonyms: Emette il sostituto configurato e interrompi l'elaborazione se il token corrisponde a un sinonimo.
  7. Stemmer: Se non è abilitato alcun sinonimo corrispondente e stemming, applicare lo stemmer inglese.

Aggiungi parole di stop e sinonimi

Il tokenizer_wholeword template può caricare stop-word personalizzati e sinonimi da tabelle lakebase_tokenizer_stopwords SQL gestite dalle estensioni e lakebase_tokenizer_synonymsda . La name colonna raggruppa le righe in un insieme che selezioni con l'opzione Stopwords o Synonyms dizionario.

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');

Fai riferimento agli insiemi quando crei o modifichi un tokenizer_wholeword dizionario:

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

L'estensione confronta le parole stop e le parole sorgente sinonimie con ciascun token dopo aver applicato , , , e EnglishPossessive, ma prima di applicare Stemmer. StripAccentsNormalizeLowercase Le voci del catalogo non vengono trasformate automaticamente, quindi memorizzale nella forma esatta prodotta da quelle opzioni abilitate:

  • Con Lowercase = 'true', usa voci minuscole. Con Lowercase = 'false', la maiuscolo deve corrispondere al token.
  • Con abilitato, memorizza Normalize le voci nel modulo di normalizzazione Unicode selezionato.
  • Con StripAccents = 'true', conserva la forma con accento striato. Ad esempio, memorizza cafe per farlo corrispondere caféa .
  • Conserva il modulo prima di stallarlo. Ad esempio, con Stemmer = 'english', una run voce non corrisponde runninga . Aggiungi running al filtro o sostituisci quel token.

I nomi dei set possono contenere fino a 256 byte. Parole e sinonimi possono contenere fino a 1024 byte. Ogni stop-word o insieme di sinonimi nominati può contenere fino a 100.000 righe.

Un sostituto sinonimo viene emesso esattamente come immagazzinato e non viene processato dal stemmer. I sinonimi supportano una sostituzione per ogni parola di origine. Per rappresentare una sostituzione multiparola come un unico lexema, si usa un separatore come un sottolineo, come in united_states.

Dopo aver cambiato un set, il proprietario di ogni dizionario che fa riferimento al set deve eseguire un no-op ALTER TEXT SEARCH DICTIONARY per forzare un ricaricamento:

ALTER TEXT SEARCH DICTIONARY documents_dict (dummy);

L'opzione dummy non esiste su tokenizer_wholeword. Omettendo un valore, PostgreSQL chiede a PostgreSQL di rimuovere questa opzione inesistente, che invalida la cache senza modificare nessuna delle opzioni configurate dal dizionario.

Dopo aver ricaricato il dizionario, rigenerare i valori memorizzati tsvector riscrivendo le righe sorgente:

UPDATE documents SET body = body;

Ruoli e accesso

Usa due ruoli per separare l'accesso alle applicazioni dall'amministrazione del tokenizer:

  • app_role utilizza dizionari esistenti. Deve USAGE essere utilizzato sugli schemi rilevanti e SELECT sulle tabelle del catalogo delle estensioni, ma non deve possedere i dizionari.
  • tokenizer_admin gestisce insiemi stop-word e sinonimi, crea e possiede dizionari e configurazioni di ricerca testuale, ed esegue il comando reload dopo aver cambiato un set.

Concedi l'accesso allo schema di estensione e alle tabelle del catalogo:

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 Serve anche CREATE nello schema dove sono memorizzati dizionari e configurazioni di ricerca testuale. Crea questi oggetti come tokenizer_admin, oppure trasferiscine la proprietà. L'accesso di scrittura alle tabelle cataloghe non garantisce la proprietà dei dizionari esistenti.

Options

Specifica tokenizer_wholeword le opzioni in CREATE TEXT SEARCH DICTIONARY o ALTER TEXT SEARCH DICTIONARY. I nomi delle opzioni non sono distinti dalla maiuscola e maiuscola.

Option Tipo Impostazione predefinita Description
Lowercase Boolean true Converte i token in minuscole prima di applicare altre operazioni. Stemmer = 'english' richiede Lowercase = 'true'.
Normalize NFC, NFD, NFKC, NFKD o none none Applica il modulo di normalizzazione Unicode selezionato. Questo canonica la rappresentazione ma non rimuove i caratteri. Ad esempio, NFC rende precomposto é e e seguito da un equivalente di accento acuto combinato.
EnglishPossessive Boolean true Rimuove un elemento finale 's, ’s, o 's quando almeno un carattere precede il suffisso. Un suffisso autonomo rimane invariato.
StripAccents Boolean false Applica la normalizzazione NFKD e rimuove i marchi di combinazione. Ad esempio, café diventa cafe. Quando questa opzione è abilitata, omettela Normalize perché il passaggio NFKD rende ridondante qualsiasi normalizzazione Unicode separata.
Stopwords Nome del set Nessuno Usa l'insieme nominato da tokenizer_ext.lakebase_tokenizer_stopwords.
Synonyms Nome del set Nessuno Utilizza l'insieme nominato dei sostituti uno a uno da tokenizer_ext.lakebase_tokenizer_synonyms.
Stemmer english Nessuno Utilizza lo stemmer inglese Snowball 3.1.0 incluso in bundle. Ometti questa opzione per disabilitare lo stemming. Lo stemmer non include una lista di parole finali.

Tabelle catalogo

Table Columns Description
lakebase_tokenizer_stopwords name text, word text Gli store hanno nominato stop-word set per template tokenizer che supportano Stopwords. la chiave primaria è (name, word).
lakebase_tokenizer_synonyms name text, word text, synonym text I negozi hanno nominato sostituti uno a uno per template di tokenizzatore che supportano Synonyms. la chiave primaria è (name, word).

Usa il ranking BM25 con lakebase_text

Le configurazioni di ricerca testuale costruite con lakebase_tokenizer producono valori standard PostgreSQL tsvector compatibili con lakebase_text. Per usare la classifica di rilevanza BM25 e il recupero top-K, crea un lakebase_bm25 indice sulla stessa tsvector colonna. Per l'installazione, la creazione di indici e la sintassi delle query, vedi lakebase_text.

Passaggi successivi