lakebase_tokenizer

L'estensione lakebase_tokenizer aggiunge tokenizzazione configurabile alla ricerca full-text di PostgreSQL in Lakebase, inclusa l'intera elaborazione dei testi e l'analisi morfologica per testo cinese, giapponese e coreano (CJK). 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 i tokenizer_wholeword template e tokenizer_morph tramite l'interfaccia standard del dizionario di ricerca testuale di PostgreSQL. Uso tokenizer_wholeword per l'elaborazione intera delle testi, inclusi normalizzazione, parole di chiusura, sinonimi e stemming inglese. Uso tokenizer_morph per analisi morfologica CJK.

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.

L'aggiornamento da 0.1.x a 0.2.0 non cambia l'output di tokenizzazione. La versione 0.2.0 aggiunge il tokenizer_morph template e le configurazioni CJK integrate, lasciando le configurazioni esistenti invariate, così non devi rigenerare tsvector valori o ricostruire indici.

Avvio rapido

Scegli un percorso in base al linguaggio del tuo testo:

  • Per l'inglese e altre lingue delimitate dagli spazi bianchi, crea un dizionario dal tokenizer_wholeword template.
  • Per testi in cinese, giapponese o coreano, usa una configurazione integrata. Non è necessario creare un dizionario.

Testo intero

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.

Testo CJK

L'installazione dell'estensione crea le tokenizer_chineseconfigurazioni , tokenizer_japanese, e tokenizer_korean di ricerca testuale. Usane uno direttamente per produrre un tsvector, creare un indice GIN ed eseguire query in testo completo:

Chinese

CREATE TABLE chinese_documents (
  id            BIGSERIAL PRIMARY KEY,
  body          TEXT NOT NULL,
  search_vector TSVECTOR GENERATED ALWAYS AS (
    to_tsvector('tokenizer_ext.tokenizer_chinese', body)
  ) STORED
);

INSERT INTO chinese_documents (body) VALUES
  ('现代分布式文件系统架构');

CREATE INDEX chinese_idx ON chinese_documents USING gin (search_vector);

-- The built-in Chinese configuration uses mixed mode, so use plainto_tsquery instead of to_tsquery.
SELECT id, body
FROM chinese_documents
WHERE search_vector @@ plainto_tsquery('tokenizer_ext.tokenizer_chinese', '现代分布式');

Japanese

CREATE TABLE japanese_documents (
  id            BIGSERIAL PRIMARY KEY,
  body          TEXT NOT NULL,
  search_vector TSVECTOR GENERATED ALWAYS AS (
    to_tsvector('tokenizer_ext.tokenizer_japanese', body)
  ) STORED
);

INSERT INTO japanese_documents (body) VALUES
  ('関西国際空港へのアクセス');

CREATE INDEX japanese_idx ON japanese_documents USING gin (search_vector);

SELECT id, body
FROM japanese_documents
WHERE search_vector @@ to_tsquery('tokenizer_ext.tokenizer_japanese', '関西国際空港');

Coreano

CREATE TABLE korean_documents (
  id            BIGSERIAL PRIMARY KEY,
  body          TEXT NOT NULL,
  search_vector TSVECTOR GENERATED ALWAYS AS (
    to_tsvector('tokenizer_ext.tokenizer_korean', body)
  ) STORED
);

INSERT INTO korean_documents (body) VALUES
  ('선생님께서 도서관에 갑니다');

CREATE INDEX korean_idx ON korean_documents USING gin (search_vector);

SELECT id, body
FROM korean_documents
WHERE search_vector @@ to_tsquery('tokenizer_ext.tokenizer_korean', '선생님께서');

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 Negozi denominati insiemi di stop-word per tokenizer_wholeword. la chiave primaria è (name, word).
lakebase_tokenizer_synonyms name text, word text, synonym text I negozi hanno nominato sostituti uno a uno per tokenizer_wholeword. la chiave primaria è (name, word).

Modello: tokenizer_morph

Il tokenizer_morph modello fornisce il supporto alla tokenizzazione per testi cinesi, giapponesi e coreani nella ricerca full-text di PostgreSQL. Usa una configurazione di ricerca testuale integrata o definiscine una personalizzata per controllare la generazione dei termini.

Come funziona

tokenizer_morph utilizza l'analizzatore Lindera con dizionari inclusi: Jieba per il cinese, IPADIC per il giapponese e MeCab KoDic per il coreano.

Per i token parser coreani, tokenizer_morph prima sostituisce ㆍ (U+318D) con un confine di token.

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

  1. Normalize: Applicare la normalizzazione Unicode al token del parser.
  2. Language: Segmentare il token parser con l'analizzatore linguistico selezionato.
  3. Filtro dei simboli: Scartare i segmenti che non contengono lettere o cifre.
  4. Analisi specifica per lingua: trasformare ogni segmento rimanente in zero o più termini, come descritto di seguito.
  5. Lowercase: Converti ogni termine in minuscolo.
  6. Stemmer: Se abilitato, termini stemma composti interamente da lettere ASCII con lo stemmer inglese aggregato. Questo passaggio non determina i termini CJK.

Il passaggio di analisi specifico per linguaggio applica queste regole:

Cinese

  • Espansione sotto-parola: In mixed modalità aggiunge i termini a due e tre caratteri contenuti nel dizionario bundled.

Giapponese

  • Filtraggio delle parti del discorso: Scartare particelle riconosciute, verbi ausiliari, congiunzioni, riempitivi, suoni non verbali, simboli non alfabetici e segmenti etichettati その他,間投.
  • Conversione della forma base: Utilizzare la forma base del dizionario di ogni segmento rimasto riconosciuto quando disponibile. Altrimenti, mantieni la sua forma superficiale.
  • Filtraggio delle parole stop-word: Scartare un termine che corrisponde all'elenco integrato delle parole funzionali giapponesi comuni.
  • Derivazione del katakana: Rimuovere un termine finale ー da un termine di almeno quattro caratteri i cui caratteri rientrano tutti nel blocco katakana (U+30A0 a U+30FF).

Coreano

  • Decomposizione: In discardmixed e modalità, dividere un composto riconosciuto, flesso o preanalizzato un segmento quando il dizionario ne fornisce i componenti. discard emette i componenti al posto dell'intero termine, e mixed emette entrambi.
  • Filtraggio delle parti del discorso: applicare il filtraggio al termine completo e a ogni componente in modo indipendente. Ometti i termini etichettati come particelle, desinenze, affissi, avverbi, determinanti, interiezioni, punteggiatura, simboli o forme non analizzabili.
  • Conversione della lettura Hangul: Usa la lettura Hangul del dizionario per un termine completo mantenuto quando disponibile. I componenti mantengono la loro forma di dizionario.

Il parser di ricerca testuale di PostgreSQL divide il testo a spazi bianchi e punteggiatura prima di chiamare tokenizer_morph. Ogni token parser può contenere fino a 2046 byte, e i token più lunghi vengono saltati con un NOTICE. La maggior parte dei caratteri cinesi, giapponesi e coreani usa 3 byte in UTF-8, quindi una serie di più di 682 di questi caratteri senza spazi bianchi o punteggiatura viene omessa dai to_tsvector risultati.

Linguaggi e modalità supportati

Le modalità disponibili dipendono dalla lingua. Ogni esempio mostra il testo sorgente → termini emessi:

Lingua Mode Behavior Example
Chinese none Emette parole dalla segmentazione standard senza aggiungere termini di ricerca più brevi. 现代分布式文件系统架构 → 现代, 分布式文件系统, 架构
Chinese mixed Impedisce la segmentazione standard delle parole e aggiunge termini di ricerca più brevi da alcune parole più lunghe. 现代分布式文件系统架构→ 现代, 分布式文件系统, 分布, 分布式, 布式, 文件系统, ,架构
Japanese none Favorisce composti di dizionario più lunghi. 関西国際空港へのアクセス → 関西国際空港, アクセス
Japanese discard Produce termini più fini per alcuni composti lunghi senza mantenere anche la loro forma completa. 関西国際空港へのアクセス → 関西, 国際, 空港, アクセス
Coreano none Mantiene le voci composte e flesse nel dizionario come termini completi. 한국어 형태소 분석 → 한국어, 형태소, 분석
Coreano discard Quando una forma composta o flessa può essere divisa, emette le sue parti invece del termine completo. 한국어 형태소 분석 → 한국, 어, 형태, 소, 분석
Coreano mixed Quando una forma composta o flessa può essere divisa, emette sia il termine completo sia le sue parti. 한국어 형태소 분석 → 한국어, 한국, 어, 형태소, 형태, 소, , 분석

In mixed modalità, si cerca con plainto_tsquery. Quando una parola di query produce più lessimi, to_tsquery, , e phraseto_tsquery li unisci all'operatore<->, che richiede posizioni websearch_to_tsqueryadiacenti. mixed La modalità inserisce posizioni extra per i termini aggiuntivi, quindi queste condizioni di frase possono mancare le corrispondenze attese. Per le query basate sulla posizione, definisci una configurazione personalizzata con none modalità or discard .

Usa le configurazioni integrate

L'installazione dell'estensione crea queste configurazioni di ricerca testuale:

Configuration Dizionario Lingua Mode
tokenizer_chinese tokenizer_chinese_dict Chinese mixed
tokenizer_japanese tokenizer_japanese_dict Japanese discard
tokenizer_korean tokenizer_korean_dict Coreano discard

Tutti e tre i dizionari impostano Stemmer = 'english' e usano i valori predefiniti Normalize = 'NFKC' e Lowercase = 'true'.

Per esempi end-to-end che utilizzano queste configurazioni, vedi CJK text.

Definisci una configurazione personalizzata

Per scegliere un'altra modalità o modificare le opzioni predefinite, crea un dizionario dal tokenizer_morph template e una configurazione di ricerca testuale che mappa i tipi di token PostgreSQL, come mostrato di seguito. Questo esempio utilizza la modalità cinese none per le query di frase:

CREATE TEXT SEARCH DICTIONARY chinese_none_dict (
  TEMPLATE = tokenizer_ext.tokenizer_morph,
  Language = 'chinese',
  Mode = 'none',
  Stemmer = 'english'
);

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

ALTER TEXT SEARCH CONFIGURATION chinese_none_cfg
  ALTER MAPPING FOR asciiword, word, numword, hword_asciipart, hword_part, hword_numpart
  WITH chinese_none_dict;

SELECT to_tsvector('chinese_none_cfg', '现代分布式文件系统架构')
  @@ phraseto_tsquery('chinese_none_cfg', '分布式文件系统 架构');

Options

Specifica tokenizer_morph 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
Language chinese, japanese o korean Required Seleziona l'analizzatore specifico della lingua.
Mode none, discard o mixed Required Controlla l'output composto e sottoparola. Le modalità supportate dipendono da: o per il cinese, none o discard per il giapponese, e none, discard, oppure mixed per il coreano.mixednoneLanguage
Normalize NFC, NFKC o none NFKC Normalizza il testo prima della segmentazione. NFC preserva le distinzioni di compatibilità. Ad esempio, full-width ABC viene lowermaesed in abc invece di essere convertito in abc, quindi non è stemmat.
Lowercase Boolean true Converte i lessemi emessi in minuscolo. Stemmer = 'english' richiede Lowercase = 'true'.
Stemmer english Nessuno Le radici sono solo lessemi composti interamente da lettere ASCII. Ometti questa opzione per disabilitare lo stemming inglese.

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