Chinese full-text search in PostgreSQL met pg_jieba in ServBay
Overzicht
Voor talen als Engels werkt de ingebouwde full-text search van PostgreSQL effectief dankzij lexicale analyse op basis van spaties en interpunctie. Maar in het Chinees ontbreken natuurlijke woordafscheidingen, dus is een gespecialiseerde segmentatietool nodig die aaneengeschakelde Hanzi-teksten in betekenisvolle woorden splitst.
pg_jieba
is een externe extensie voor PostgreSQL die de populaire Jieba Chinese segmentatiebibliotheek integreert. Met pg_jieba
kun je effectief en nauwkeurig Chinese tekst segmenteren binnen PostgreSQL, waarmee krachtige full-text zoekmogelijkheden voor Chinees mogelijk worden.
ServBay is een geïntegreerde lokale webontwikkelomgeving waarin pg_jieba
al is voorgeïnstalleerd. Hierdoor hoef je geen ingewikkelde compilatie- en installatieprocedures te doorlopen en kun je snel aan de slag met Chinese full-text search op je eigen laptop.
Dit artikel legt stap voor stap uit hoe je de pg_jieba
extensie in ServBay activeert, configureert en gebruikt.
Vereisten
Zorg ervoor dat je aan de volgende voorwaarden voldoet voordat je pg_jieba
gebruikt:
- ServBay is geïnstalleerd op je macOS-systeem en de PostgreSQL-database draait correct.
- Je hebt basiskennis van PostgreSQL, zoals databaseverbinding maken en SQL-commando's uitvoeren.
Installeren en activeren van pg_jieba
ServBay levert de pg_jieba
extensie standaard mee met PostgreSQL. Handmatig downloaden of compileren is dus niet nodig—activeren gaat simpelweg via een SQL-commando.
Stappen om pg_jieba
te activeren:
Verbind met je PostgreSQL-database: Open de Terminal en gebruik het
psql
command-line tool om met je PostgreSQL-database te verbinden. Vervangyour_username
door je gebruikersnaam enyour_database
door de gewenste database. Standaard zijn deze in ServBay vaakservbay
ofpostgres
.bashpsql -U your_username -d your_database
1Bijvoorbeeld, met de standaardgebruiker en -database:
bashpsql -U servbay -d servbay
1Maak en activeer de pg_jieba-extensie: Voer in de psql-interface het volgende SQL-commando uit:
sqlCREATE EXTENSION pg_jieba;
1Als de extensie al eerder is aangemaakt, kan een foutmelding verschijnen—dit is normaal.
Controleer of pg_jieba actief is: Toon de geïnstalleerde extensies met:
sql\dx
1Verschijnt
pg_jieba
in de lijst, dan is de activatie geslaagd.
pg_jieba configureren voor Chinese full-text search
Na het activeren van de extensie stel je PostgreSQL in voor tekstzoekacties, waarbij pg_jieba
als parser optreedt.
Tekstzoekconfiguratie instellen
Een tekstzoekconfiguratie bepaalt hoe documenten worden verwerkt ten behoeve van full-text search: welke parser segmentatie uitvoert en hoe verschillende token-types worden behandeld.
Maak een nieuwe tekstzoekconfiguratie: Maak een configuratie
chinese
aan diepg_jieba
als parser gebruikt.sqlCREATE TEXT SEARCH CONFIGURATION chinese (PARSER = pg_jieba);
1Deze configuratie instrueert PostgreSQL bij tekstverwerking gebruik te maken van
pg_jieba
.Voeg token-mappings toe: De
pg_jieba
parser levert verschillende token-types gebaseerd op woordsoorten. Om deze te gebruiken voor indexing en zoekacties, koppel je ze aan een specifiek dictionary. We koppelen hier veelgebruikte soorten (zoals zelfstandig naamwoord, werkwoord, bijvoeglijk naamwoord etc.) aan de standaardsimple
dictionary van PostgreSQL—deze voert geen verdere transformatie uit.sqlALTER TEXT SEARCH CONFIGURATION chinese ADD MAPPING FOR n,v,a,i,e,l WITH simple;
1n, v, a, i, e, l
zijn voorbeelden van woordsoortlabels diepg_jieba
kan herkennen. Je kunt deze aanvullen of aanpassen naar wens. Veel voorkomende labels zijn:n
: Zelfstandig naamwoordv
: Werkwoorda
: Bijvoeglijk naamwoordi
: Idiomee
: Tussenwerpsell
: Uitdrukkingnr
: Persoonsnaamns
: Plaatsnaamnt
: Organisatienz
: Eigennaam (overig)m
: Telwoordq
: Maatwoordt
: Tijdsaanduidings
: Locatiewoordenf
: Richtingp
: Voorzetselc
: Voegwoordu
: Partikelxc
: Overige functiewoordenw
: Interpunctieeng
: Engelsx
: Niet-morfologisch karakter
Meestal wil je vooral betekenisvolle tokens indexeren, zoals zelfstandige naamwoorden, werkwoorden en bijvoeglijke naamwoorden.
Voorbeeld van full-text search met pg_jieba
Nu kun je direct full-text search op Chinese tekst uitvoeren met behulp van pg_jieba
. Hieronder een volledig voorbeeld.
Aanmaken van voorbeeldtabel en data
Maak eerst een tabel voor opslag van Chinese teksten, en voeg voorbeeldgegevens toe.
Tabel aanmaken:
sqlCREATE TABLE documents ( id SERIAL PRIMARY KEY, content TEXT );
1
2
3
4Voorbeeldgegevens invoegen:
sqlINSERT INTO documents (content) VALUES ('Ik hou van natuurtaalverwerkingstechnologie'), ('Chinese segmentatie is een belangrijke stap in tekstverwerking'), ('pg_jieba is een uitstekende Chinese segmentatietool gebaseerd op Jieba'), ('ServBay maakt lokale ontwikkeling eenvoudig en efficiënt');
1
2
3
4
5
Full-text zoekindex maken
Voor optimale prestaties, vooral bij grote datasets, is het sterk aanbevolen om een index aan te maken op de zoekkolom. PostgreSQL's GIN (Generalized Inverted Index) is ideaal voor full-text search.
GIN-index aanmaken: Gebruik
to_tsvector
samen met de eerder ingerichtechinese
configuratie om een GIN-index op decontent
-kolom te bouwen.sqlCREATE INDEX idx_gin_content ON documents USING gin (to_tsvector('chinese', content));
1
Full-text zoekopdrachten uitvoeren
Nu kun je met de combinatie van to_tsquery
en de @@
operator full-text zoekopdrachten doen. to_tsquery('chinese', 'zoekopdracht')
converteert de zoekzin volgens de chinese
configuratie, waarna @@
checkt of een document matcht.
Zoekopdracht uitvoeren: Zoek documenten die zowel “中文” als “分词” bevatten.
sqlSELECT id, content FROM documents WHERE to_tsvector('chinese', content) @@ to_tsquery('chinese', '中文 & 分词');
1
2
3
4
5Het teken
&
intsquery
betekent een logische EN. Je kunt ook|
(OF) of!
(NIET) gebruiken.Bijvoorbeeld, zoek documenten met “ServBay” of “开发”:
sqlSELECT id, content FROM documents WHERE to_tsvector('chinese', content) @@ to_tsquery('chinese', 'ServBay | 开发');
1
2
3
4
5
Aangepaste woordenlijsten
pg_jieba
gebruikt standaard de ingebouwde woordenlijst van Jieba. In specifieke gevallen wil je mogelijk eigen termen toevoegen (bijvoorbeeld vakjargon of productnamen) om de segmentatienauwkeurigheid te verhogen.
Dit kan via een zelfgemaakt woordenlijstbestand, te configureren in pg_jieba
.
Toevoegen van aangepaste woorden
Maak een custom woordenlijstbestand: Maak een nieuw tekstbestand in de configuratiemap van ServBay, bijvoorbeeld:
plaintext/Applications/ServBay/etc/pg_jieba/custom_dict.txt
1Let op: dit pad is ter suggestie, gebruik het pad dat past bij jouw ServBay-installatie.
Voeg woorden toe in het bestand: Open
custom_dict.txt
in een teksteditor en voeg één woord per regel toe. Optioneel kun je een frequentie en woordsoort toevoegen, gescheiden door spaties:woord [frequentie [type]]
. Een hogere frequentie betekent een grotere kans dat het woord als aparte token wordt herkend.plaintextNatuurtaalverwerking 3 n ServBay 5 eng Jieba-segmentatie 3 n
1
2
3Hier duidt
3 n
aan dat "Natuurtaalverwerking" een frequentie van 3 heeft en een zelfstandig naamwoord is.Configureer pg_jieba om de custom woordenlijst te gebruiken: Stel in je PostgreSQL-sessie de parameter
pg_jieba.dict_path
in naar de directory van je aangepaste woordenlijst. Let op: Meestal geef je de directory op, niet het bestand zelf. Staat je custom dictionary in dezelfde map als de hoofdwoordenlijst of in een standaardmap vanpg_jieba
, dan is verder instellen mogelijk niet nodig. Raadpleeg de ServBay-documentatie voor details.Indien door ServBay toegestaan, kan het commando er als volgt uitzien:
sqlSET pg_jieba.dict_path = '/Applications/ServBay/etc/pg_jieba/'; -- Ga ervan uit dat de woordenlijst hier staat
1Of, als directe bestandsspecificatie mogelijk is (let op: dit is niet standaard PostgreSQL-gedrag):
sqlSET pg_jieba.dict_path = '/Applications/ServBay/etc/pg_jieba/custom_dict.txt'; -- Gebruik dit voorzichtig en controleer je ServBay-configuratie
1Belangrijk: Het
SET
-commando geldt alleen voor de huidige sessie. Voor een permanente werking moet jepostgresql.conf
aanpassen.
Woordenlijst herladen
Na het aanpassen van het woordenlijstbestand of de pg_jieba.dict_path
-instelling, moet je de woordenlijst herladen om de wijzigingen actief te maken.
Herladen van de woordenlijst: Voer het volgende SQL-commando uit:
sqlSELECT jieba_reload_dict();
1Hierna gebruikt
pg_jieba
de bijgewerkte lijst bij nieuwe segmentaties.
Veelgestelde vragen (FAQ)
Vraag: Wat te doen als ik de foutmelding "extension 'pg_jieba' is not available" krijg bij
CREATE EXTENSION pg_jieba;
? Antwoord: Dit betekent meestal dat depg_jieba
extensiebestanden niet correct in de PostgreSQL extensiemap staan, of dat PostgreSQL ze niet kan vinden. In ServBay zoupg_jieba
standaard beschikbaar moeten zijn. Controleer of je met de via ServBay geleverde PostgreSQL-instantie werkt en of de installatie onbeschadigd is. Probeer eventueel ServBay opnieuw te starten of check de ServBay-logbestanden.Vraag: Mijn custom woordenlijst werkt niet, wat nu? Antwoord: Controleer het volgende:
- Klopt het pad naar het woordenlijstbestand, en heeft de PostgreSQL-gebruiker leesrechten?
- Is het bestand correct geformatteerd, één woord per regel, met optioneel frequentie en type?
- Is de parameter
pg_jieba.dict_path
goed gezet? Onthoud datSET
enkel voor de lopende sessie geldt; voor blijvende werking moet jepostgresql.conf
aanpassen. - Heb je
SELECT jieba_reload_dict();
uitgevoerd om de woordenlijst te herladen? - Als je
postgresql.conf
hebt aangepast, is PostgreSQL daarna opnieuw opgestart?
Vraag: Mijn zoekresultaten zijn onnauwkeurig, wat kan ik doen? Antwoord: De nauwkeurigheid hangt af van zowel de segmentatie als de geïnterpreteerde zoekopdracht.
- Controleer segmentatieresultaten met
ts_debug('chinese', 'je tekst')
om te zien hoe je tekst door dechinese
configuratie wordt gesegmenteerd. - Optimaliseer de segmentatie door de mappings in
ALTER TEXT SEARCH CONFIGURATION chinese ADD MAPPING FOR ... WITH simple;
te verfijnen, en onbelangrijke woordsoorten (zoals partikels, interpunctie) uit te sluiten. - Verbeter je zoekquery door je zoektermen en logische operatoren (
&
,|
,!
) nauwkeurig af te stemmen op je zoekintentie.
- Controleer segmentatieresultaten met
Samenvatting
pg_jieba
is een krachtige oplossing om binnen PostgreSQL Chinese full-text search te realiseren. Dankzij de voorgeïnstalleerde pg_jieba
extensie in ServBay kun je snel lokaal Chinese tekstanalyse inschakelen en configureren. Door de stappen in dit artikel te volgen, weet je nu hoe je pg_jieba
installeert in ServBay, tekstzoekconfiguraties aanmaakt, basiszoekopdrachten uitvoert en aangepaste woordenlijsten inzet voor optimale resultaten. Pas deze technieken toe in je eigen projecten om de doorzoekbaarheid van Chinese content sterk te verbeteren.