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
psqlcommand-line tool om met je PostgreSQL-database te verbinden. Vervangyour_usernamedoor je gebruikersnaam enyour_databasedoor de gewenste database. Standaard zijn deze in ServBay vaakservbayofpostgres.bashpsql -U your_username -d your_database1Bijvoorbeeld, met de standaardgebruiker en -database:
bashpsql -U servbay -d servbay1Maak 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\dx1Verschijnt
pg_jiebain 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
chineseaan diepg_jiebaals 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_jiebaparser 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 standaardsimpledictionary 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, lzijn voorbeelden van woordsoortlabels diepg_jiebakan 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_tsvectorsamen met de eerder ingerichtechineseconfiguratie 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
&intsquerybetekent 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.txt1Let op: dit pad is ter suggestie, gebruik het pad dat past bij jouw ServBay-installatie.
Voeg woorden toe in het bestand: Open
custom_dict.txtin 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 n1
2
3Hier duidt
3 naan 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_pathin 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 staat1Of, 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-configuratie1Belangrijk: Het
SET-commando geldt alleen voor de huidige sessie. Voor een permanente werking moet jepostgresql.confaanpassen.
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_jiebade 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_jiebaextensiebestanden niet correct in de PostgreSQL extensiemap staan, of dat PostgreSQL ze niet kan vinden. In ServBay zoupg_jiebastandaard 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_pathgoed gezet? Onthoud datSETenkel voor de lopende sessie geldt; voor blijvende werking moet jepostgresql.confaanpassen. - Heb je
SELECT jieba_reload_dict();uitgevoerd om de woordenlijst te herladen? - Als je
postgresql.confhebt 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 dechineseconfiguratie 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.
