Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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_wholewordtemplate. - 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:
-
Lowercase: Converti il token in minuscolo. -
Normalize: Applicare la normalizzazione Unicode. -
StripAccents: Rimuovere gli accenti. -
EnglishPossessive: Rimuovere un suffisso possessivo inglese quando rimane almeno un carattere. -
Stopwords: Non emettere lexema e interrompere l'elaborazione se il token corrisponde a una parola di arresto configurata. Il token viene omesso dal generatoretsvector. -
Synonyms: Emette il sostituto configurato e interrompi l'elaborazione se il token corrisponde a un sinonimo. -
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. ConLowercase = 'false', la maiuscolo deve corrispondere al token. - Con abilitato, memorizza
Normalizele voci nel modulo di normalizzazione Unicode selezionato. - Con
StripAccents = 'true', conserva la forma con accento striato. Ad esempio, memorizzacafeper farlo corrisponderecaféa . - Conserva il modulo prima di stallarlo. Ad esempio, con
Stemmer = 'english', unarunvoce non corrisponderunninga . Aggiungirunningal 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_roleutilizza dizionari esistenti. DeveUSAGEessere utilizzato sugli schemi rilevanti eSELECTsulle tabelle del catalogo delle estensioni, ma non deve possedere i dizionari. -
tokenizer_admingestisce 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:
-
Normalize: Applicare la normalizzazione Unicode al token del parser. -
Language: Segmentare il token parser con l'analizzatore linguistico selezionato. - Filtro dei simboli: Scartare i segmenti che non contengono lettere o cifre.
- Analisi specifica per lingua: trasformare ogni segmento rimanente in zero o più termini, come descritto di seguito.
-
Lowercase: Converti ogni termine in minuscolo. -
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
mixedmodalità 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
discardmixede modalità, dividere un composto riconosciuto, flesso o preanalizzato un segmento quando il dizionario ne fornisce i componenti.discardemette i componenti al posto dell'intero termine, emixedemette 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.