Ricerca Full-Text in Cinese su PostgreSQL usando pg_jieba in ServBay
Panoramica
Per lingue come l’inglese, la funzione di ricerca full-text incorporata in PostgreSQL funziona efficacemente tramite analisi lessicale basata su spazi e punteggiatura. Tuttavia, il cinese non utilizza spazi naturali tra le parole, rendendo necessaria una soluzione di tokenizzazione specifica che suddivida sequenze di caratteri cinesi in termini semanticamente indipendenti.
pg_jieba
è un’estensione di terze parti per PostgreSQL che integra la popolare libreria cinese di tokenizzazione Jieba. Tramite pg_jieba
, puoi effettuare la segmentazione di testo cinese in modo efficiente e preciso direttamente in PostgreSQL, abilitando potenti funzionalità di ricerca full-text in cinese.
ServBay, ambiente integrato per lo sviluppo web locale, include già l’estensione pg_jieba
, eliminando la necessità di installazione manuale o compilazione, e consentendoti di sviluppare e testare rapidamente la ricerca full-text in locale.
In questa guida vedrai come abilitare, configurare e utilizzare l’estensione pg_jieba
in ServBay.
Prerequisiti
Prima di utilizzare pg_jieba
, assicurati di aver completato i seguenti passaggi:
- Hai installato ServBay su macOS e il database PostgreSQL è funzionante.
- Hai familiarità con le operazioni di base di PostgreSQL, come la connessione e l’esecuzione di comandi SQL.
Installazione e abilitazione di pg_jieba
In ServBay, il modulo estensione pg_jieba
viene già fornito insieme a PostgreSQL. Non è necessario scaricarlo o compilarlo: basta eseguire un semplice comando SQL nel database target per abilitarlo.
Procedura per abilitare l’estensione pg_jieba
:
Connettiti al database PostgreSQL:
Apri il terminale e usa lo strumento a riga di comandopsql
per collegarti al tuo database. Sostituisciyour_username
col nome utente PostgreSQL eyour_database
con il nome del database. Gli utenti e database di default ServBay sono di solitoservbay
opostgres
.bashpsql -U your_username -d your_database
1Ad esempio, con utente e database predefiniti:
bashpsql -U servbay -d servbay
1Crea e abilita l'estensione
pg_jieba
:
Da psql, esegui questo comando SQL:sqlCREATE EXTENSION pg_jieba;
1Se l’estensione è già presente, il comando potrebbe restituire un errore: è normale.
Verifica che
pg_jieba
sia abilitato:
Elenca le estensioni installate con:sql\dx
1Se nella lista compare
pg_jieba
, allora l’estensione è attiva.
Configurazione di pg_jieba per la ricerca full-text in cinese
Dopo aver abilitato pg_jieba
, occorre configurare la ricerca testuale di PostgreSQL per usare pg_jieba
come tokenizzatore.
Imposta la configurazione di ricerca testuale
La configurazione di ricerca testuale determina come vengono processati i documenti per la ricerca full-text, incluso quale parser usare e come gestire i diversi tipi di token.
Crea una nuova configurazione:
Crea una configurazione chiamatachinese
che usapg_jieba
come parser.sqlCREATE TEXT SEARCH CONFIGURATION chinese (PARSER = pg_jieba);
1Questa configurazione istruisce PostgreSQL a usare
pg_jieba
per dividere il testo.Mappa i risultati della segmentazione (Mapping):
Il parserpg_jieba
produce diversi tipi di token in base alla parte del discorso. Per indicizzarli e renderli ricercabili, mappali su uno specifico dizionario. Qui, le principali parti del discorso (come nome, verbo, aggettivo, ecc.) sono mappate sul dizionario built-insimple
di PostgreSQL, che lascia i token invariati.sqlALTER TEXT SEARCH CONFIGURATION chinese ADD MAPPING FOR n,v,a,i,e,l WITH simple;
1n,v,a,i,e,l
sono alcuni dei tag chepg_jieba
riconosce. Puoi aggiungere o modificarli a seconda delle esigenze. Alcuni tra i più comuni:n
: sostantivov
: verboa
: aggettivoi
: idiomaticoe
: esclamazionel
: espressionenr
: nome proprions
: nome geograficont
: organizzazionenz
: altro nome propriom
: numeraleq
: classificatoret
: tempos
: luogof
: direzionalep
: preposizionec
: congiunzioneu
: particellaxc
: altre particellew
: punteggiaturaeng
: inglesex
: carattere non lessicale
In genere si indica e si ricerca soprattutto termini di reale significato, come nomi, verbi e aggettivi.
Esempio di ricerca full-text con pg_jieba
Dopo la configurazione, puoi usare pg_jieba
per ricerche full-text su testo cinese. Ecco un esempio pratico:
Crea tabella e dati di esempio
Per prima cosa, crea una tabella per archiviare documenti con testo in cinese.
Crea la tabella:
sqlCREATE TABLE documents ( id SERIAL PRIMARY KEY, content TEXT );
1
2
3
4Inserisci dati di esempio:
sqlINSERT INTO documents (content) VALUES ('我爱自然语言处理技术'), ('中文分词是文本处理的重要步骤'), ('pg_jieba是一个很好的中文分词工具,它基于结巴分词库'), ('ServBay 让本地开发变得简单高效');
1
2
3
4
5
Crea un indice per la ricerca full-text
Per migliorare l’efficienza della ricerca, specialmente con molti dati, è altamente consigliato creare un indice sulla colonna usata per la ricerca. PostgreSQL offre l’indice GIN (Generalized Inverted Index), ideale per la ricerca full-text.
Crea indice GIN:
Usiamo la funzioneto_tsvector
insieme alla configurazionechinese
per indicizzare la colonnacontent
.to_tsvector('chinese', content)
trasforma il testo in un tipotsvector
, usato internamente per la ricerca.sqlCREATE INDEX idx_gin_content ON documents USING gin (to_tsvector('chinese', content));
1
Esegui query di ricerca full-text
Ora puoi effettuare ricerche con la funzione to_tsquery
abbinata all’operatore @@
. to_tsquery('chinese', 'query')
trasforma la frase di ricerca nel formato giusto secondo la configurazione chinese
. Con @@
verifichi se un tsvector
corrisponde a una tsquery
.
Esegui una ricerca: Cerca documenti che contengano sia "中文" che "分词".
sqlSELECT id, content FROM documents WHERE to_tsvector('chinese', content) @@ to_tsquery('chinese', '中文 & 分词');
1
2
3
4
5Il simbolo
&
rappresenta AND logico. Puoi anche usare|
(OR) e!
(NOT).Esempio: trova documenti che contengano "ServBay" o "开发":
sqlSELECT id, content FROM documents WHERE to_tsvector('chinese', content) @@ to_tsquery('chinese', 'ServBay | 开发');
1
2
3
4
5
Dizionario personalizzato
pg_jieba
usa il dizionario predefinito di Jieba per la tokenizzazione. In alcuni casi, potresti voler aggiungere termini personalizzati (es. terminologia tecnica, nomi di prodotti) per aumentare l’accuratezza.
Puoi creare un file di dizionario personalizzato e configurare pg_jieba
per utilizzarlo.
Aggiungi termini personalizzati
Crea un file dizionario personalizzato: Nella cartella di configurazione di ServBay, crea un file di testo. Ad esempio:
plaintext/Applications/ServBay/etc/pg_jieba/custom_dict.txt
1Questo è un percorso suggerito: adatta in base all’installazione di ServBay e alle tue preferenze.
Aggiungi i termini al dizionario: Apri
custom_dict.txt
con un editor e inserisci un termine per riga. Puoi opzionalmente indicare frequenza e tag separati da uno spazio. Il formato ètermine [frequenza [tag]]
. Più alta la frequenza, più probabile che il termine sia riconosciuto.plaintext自然语言处理 3 n ServBay 5 eng 结巴分词库 3 n
1
2
3Ad esempio,
3 n
indica che "自然语言处理" ha frequenza 3 e tag sostantivo (n
).5 eng
indica "ServBay", frequenza 5 e tag inglese (eng
).Configura
pg_jieba
per usare il dizionario personalizzato: Nella sessione PostgreSQL, imposta il parametropg_jieba.dict_path
verso la cartella che contiene il dizionario personalizzato.
Nota:pg_jieba.dict_path
di solito punta alla cartella, non a un solo file. Se il file custom è nella stessa cartella del dizionario principale, spesso non serve modificare il parametro, oppure ServBay può avere delle specifiche proprie. Consulta la documentazione di ServBay per dettagli sudict_path
.Se ServBay permette la specifica diretta del file, oppure se il file custom è in una cartella scansionata di default, il comando
SET
potrebbe variare o non essere necessario.
Esempio (adatta alle tue necessità):sqlSET pg_jieba.dict_path = '/Applications/ServBay/etc/pg_jieba/'; -- Supponiamo che il dizionario principale e custom siano qui
1Oppure, se eccezionalmente fosse accettato il file singolo:
sqlSET pg_jieba.dict_path = '/Applications/ServBay/etc/pg_jieba/custom_dict.txt'; -- Usare con cautela, verifica la configurazione ServBay
1Nota importante: Il comando
SET
vale solo per la sessione corrente. Per renderlo permanente, modifica il file di configurazionepostgresql.conf
impostando il percorso nel parametropg_jieba.dict_path
.
Ricarica i dizionari
Dopo aver modificato il dizionario personalizzato o la variabile pg_jieba.dict_path
, occorre ricaricare i dizionari per rendere effettive le modifiche.
Ricarica dizionari: Esegui la funzione SQL:
sqlSELECT jieba_reload_dict();
1Una volta completato, le modifiche saranno operative sulle successive tokenizzazioni.
Domande Frequenti (FAQ)
D: Ricevo l’errore "extension 'pg_jieba' is not available" durante
CREATE EXTENSION pg_jieba;
. Cosa fare?
R: Questo di solito indica che il file di estensione non è disponibile nella directory estensioni di PostgreSQL o non è stato trovato. Su ServBay, l’estensione dovrebbe già essere presente: assicurati di essere connesso all’istanza PostgreSQL fornita da ServBay e che l’installazione non sia corrotta. Se il problema persiste, prova a riavviare ServBay o verifica i log di ServBay.D: Il dizionario personalizzato non viene applicato, cosa posso fare?
R: Controlla questi punti:- Il percorso del dizionario è corretto e l’utente PostgreSQL ha i permessi di lettura.
- Il formato del file è corretto: un termine per riga, frequenza e tag opzionali separati da spazio.
- Hai impostato correttamente la variabile
pg_jieba.dict_path
. Ricorda cheSET
vale solo per la sessione; per rendere le modifiche persistenti, modificapostgresql.conf
. - Hai eseguito
SELECT jieba_reload_dict();
per ricaricare i termini. - Se hai modificato
postgresql.conf
, hai riavviato PostgreSQL?
D: I risultati della ricerca non sono accurati. Suggerimenti? R: L’accuratezza della ricerca dipende dalla segmentazione e dalla costruzione della query.
- Controlla la segmentazione con
ts_debug('chinese', 'tuo testo')
per vedere comechinese
segmenta il testo, verificando anche se i termini personalizzati vengono riconosciuti. - Ottimizza la segmentazione regolando i tag inclusi in
ALTER TEXT SEARCH CONFIGURATION chinese ADD MAPPING FOR ... WITH simple;
, escludendo tag meno rilevanti (come particelle o punteggiatura). - Ottimizza la query scegliendo i termini e gli operatori logici (
&
,|
,!
) più adatti alle tue necessità.
- Controlla la segmentazione con
Conclusione
pg_jieba
è uno strumento potente per implementare una ricerca full-text in cinese con PostgreSQL. Grazie all’integrazione pronta all’uso di ServBay, gli sviluppatori possono facilmente abilitare e configurare la segmentazione cinese nel proprio ambiente locale. Seguendo i passaggi di questa guida hai imparato come installare pg_jieba
, creare e configurare la ricerca testuale, eseguire query di base e usare dizionari personalizzati per risultati ancora più precisi. Integrando queste tecniche nei tuoi progetti potrai rendere moltissimo più efficace la ricerca su testi in cinese.