Chinesische Volltextsuche mit pg_jieba in ServBay und PostgreSQL
Überblick
Für Sprachen wie Englisch funktioniert die integrierte Volltextsuche von PostgreSQL standardmäßig effizient, da sie auf der Trennung durch Leerzeichen und Satzzeichen basiert. Im Chinesischen fehlen jedoch natürliche Wortgrenzen, daher ist ein spezielles Segmentierungs-Tool erforderlich, um zusammenhängende Schriftzeichen in sinnvolle Begriffe zu zerlegen.
pg_jieba
ist ein Drittanbieter-Extension-Modul für PostgreSQL, das die populäre Jieba (结巴分词)-Bibliothek zur chinesischen Wortsegmentierung integriert. Mit pg_jieba
können Sie chinesischen Text innerhalb von PostgreSQL effizient und präzise segmentieren und darauf leistungsstarke Volltextsuche aufbauen.
ServBay ist eine integrierte lokale Webentwicklung-Umgebung, die die pg_jieba
-Erweiterung bereits vorbereitet enthält. Das erspart komplizierte Installations- und Kompilierungsprozesse und ermöglicht es Ihnen, schnell eine chinesische Volltextsuche lokal zu entwickeln und zu testen.
In diesem Artikel erfahren Sie, wie Sie pg_jieba
in ServBay aktivieren, konfigurieren und nutzen.
Voraussetzungen
Bevor Sie pg_jieba
einsetzen, stellen Sie bitte Folgendes sicher:
- ServBay ist auf Ihrem macOS-System installiert, und die PostgreSQL-Datenbank läuft erfolgreich.
- Grundlegende Kenntnisse im Umgang mit PostgreSQL, einschließlich Verbindung zur Datenbank und Ausführung von SQL-Befehlen.
Installation und Aktivierung von pg_jieba
ServBay liefert das pg_jieba
-Extension-Modul bereits im PostgreSQL-Paket mit. Sie müssen nichts separat herunterladen oder kompilieren, sondern die Erweiterung nur über ein einfaches SQL-Kommando in Ihrer Zieldatenbank aktivieren.
Folgen Sie diesen Schritten, um pg_jieba
zu aktivieren:
Verbinden Sie sich mit Ihrer PostgreSQL-Datenbank: Öffnen Sie das Terminal und nutzen Sie das
psql
-Kommandozeilen-Tool, um sich mit Ihrer PostgreSQL-Datenbank zu verbinden. Ersetzen Sieyour_username
durch Ihren PostgreSQL-Benutzernamen undyour_database
durch den Namen Ihrer Datenbank. ServBay verwendet normalerweiseservbay
oderpostgres
als Standardbenutzer und -datenbank.bashpsql -U your_username -d your_database
1Beispiel mit Standardbenutzer und -datenbank:
bashpsql -U servbay -d servbay
1Erstellen und aktivieren Sie die
pg_jieba
-Erweiterung: Führen Sie in derpsql
-Konsole folgenden SQL-Befehl aus:sqlCREATE EXTENSION pg_jieba;
1Falls die Erweiterung bereits existiert, erscheint eine Fehlermeldung. Das ist unbedenklich.
Überprüfen Sie, ob
pg_jieba
aktiviert ist: Mit folgendem Befehl listen Sie die in Ihrer Datenbank installierten Erweiterungen auf:sql\dx
1Wird
pg_jieba
gelistet, ist die Erweiterung erfolgreich aktiviert.
Konfiguration von pg_jieba für chinesische Volltextsuche
Nach der Aktivierung von pg_jieba
müssen Sie die Textsuche (Text Search) in PostgreSQL so konfigurieren, dass pg_jieba
als Parser für die Segmentierung zum Einsatz kommt.
Textsuche-Konfiguration
Die Konfiguration für die Textsuche legt fest, wie ein Dokument für die Volltextsuche verarbeitet wird – das betrifft den verwendeten Parser und die Behandlung unterschiedlicher Token-Typen.
Erstellen Sie eine neue Textsuche-Konfiguration: Legen Sie eine neue Konfiguration mit dem Namen
chinese
an und geben Siepg_jieba
als Parser vor.sqlCREATE TEXT SEARCH CONFIGURATION chinese (PARSER = pg_jieba);
1Damit werden alle von PostgreSQL durchgeführten Segmentierungen mit
pg_jieba
verarbeitet.Fügen Sie eine Zuweisung (Mapping) für Segmentierungsergebnisse hinzu: Der
pg_jieba
-Parser erzeugt Tokens unterschiedlicher Wortarten (parts of speech). Damit diese indexiert und durchsucht werden können, müssen sie auf bestimmte Wörterbücher abgebildet werden. In diesem Beispiel ordnen wir die gängigen Wortarten (Nomen n, Verb v, Adjektiv a usw.) dem eingebauten PostgreSQL-Wörterbuchsimple
zu. Dassimple
-Wörterbuch verändert die Tokens nicht und übernimmt sie direkt vom Parser.sqlALTER TEXT SEARCH CONFIGURATION chinese ADD MAPPING FOR n,v,a,i,e,l WITH simple;
1Die Kürzel
n,v,a,i,e,l
stehen für einige der vonpg_jieba
erkannten Wortarten. Sie können sie je nach Bedarf erweitern oder anpassen. Gängige Wortarten sind:n
: Nomenv
: Verba
: Adjektivi
: Idiome
: Interjektionl
: Redewendungnr
: Personennamens
: Ortsnament
: Organisationnz
: Eigennamenm
: Zahlwortq
: Zähleinheitswortt
: Zeitangabes
: Ortswortf
: Richtungswortp
: Präpositionc
: Konjunktionu
: Partikelxc
: andere Funktionswörterw
: Satzzeicheneng
: Englischx
: nicht-morphemische Wörter
Für Indizierung und Suche konzentrieren Sie sich meist auf bedeutsame Wortarten wie Nomen, Verben und Adjektive.
Beispiel: Volltextsuche mit pg_jieba
Nach der Konfiguration können Sie die chinesische Volltextsuche direkt nutzen. Hier ein einfaches Beispiel:
Beispieltabelle und -daten anlegen
Erstellen Sie zunächst eine Tabelle zur Speicherung von Dokumenten und fügen Sie einige Beispieldaten mit chinesischem Text ein.
Tabelle erstellen:
sqlCREATE TABLE documents ( id SERIAL PRIMARY KEY, content TEXT );
1
2
3
4Beispieldaten einfügen:
sqlINSERT INTO documents (content) VALUES ('我爱自然语言处理技术'), ('中文分词是文本处理的重要步骤'), ('pg_jieba是一个很好的中文分词工具,它基于结巴分词库'), ('ServBay 让本地开发变得简单高效');
1
2
3
4
5
Volltext-Index erstellen
Um die Sucheffizienz zu sichern – besonders bei großen Datenmengen – empfiehlt sich ein Index auf der Spalte, die für die Volltextsuche verwendet wird. Der GIN-Index (Generalized Inverted Index) von PostgreSQL eignet sich dafür hervorragend.
GIN-Index anlegen: Verwenden Sie die Funktion
to_tsvector
mit Ihrerchinese
-Konfiguration, um auf der Spaltecontent
einen GIN-Index zu erstellen.to_tsvector('chinese', content)
konvertiert den Inhalt über die mitpg_jieba
verbundene Konfiguration in einentsvector
, das interne Format für die Textsuche in PostgreSQL.sqlCREATE INDEX idx_gin_content ON documents USING gin (to_tsvector('chinese', content));
1
Volltextabfrage ausführen
Sie können jetzt die Funktion to_tsquery
gemeinsam mit dem @@
-Operator verwenden, um Suchabfragen auf Ihren Daten zu starten. to_tsquery('chinese', 'Suchbegriff')
wandelt Ihre Suchbegriffe in eine tsquery
um. Der Operator @@
prüft, ob ein tsvector
mit einer tsquery
übereinstimmt.
Suchabfrage durchführen: Suchen Sie beispielsweise Dokumente, die sowohl „中文“ als auch „分词“ enthalten.
sqlSELECT id, content FROM documents WHERE to_tsvector('chinese', content) @@ to_tsquery('chinese', '中文 & 分词');
1
2
3
4
5Das Zeichen
&
steht intsquery
für logisches UND. Alternativ können Sie mit|
ein logisches ODER formulieren oder mit!
eine Negation.Beispielsuche nach Dokumenten, die „ServBay“ oder „开发“ enthalten:
sqlSELECT id, content FROM documents WHERE to_tsvector('chinese', content) @@ to_tsquery('chinese', 'ServBay | 开发');
1
2
3
4
5
Benutzerdefiniertes Wörterbuch
pg_jieba
verwendet standardmäßig das Wörterbuch der Jieba-Bibliothek. Für spezielle Fachbegriffe, Produktnamen oder andere eigene Vokabeln können Sie individuelle Wörterbücher ergänzen, um die Segmentierungsgenauigkeit zu erhöhen.
Sie können dazu eine eigene Wörterbuchdatei anlegen und pg_jieba so konfigurieren, dass diese verwendet wird.
Eigene Begriffe hinzufügen
Erstellen Sie eine benutzerdefinierte Wörterbuchdatei: Legen Sie im Konfigurationsverzeichnis von ServBay eine Textdatei an, zum Beispiel:
plaintext/Applications/ServBay/etc/pg_jieba/custom_dict.txt
1Dies ist ein empfohlener Pfad – passen Sie ihn bei Bedarf entsprechend Ihrer Installation an.
Fügen Sie Begriffe zum Wörterbuch hinzu: Öffnen Sie die Datei
custom_dict.txt
mit einem Texteditor und schreiben Sie pro Zeile einen individuellen Begriff. Optional können Sie hinter dem Begriff Häufigkeit (frequency) und Wortart (tag) mit Leerzeichen getrennt angeben. Das Format lautet:Begriff [Frequency [Tag]]
. Je höher die Frequency, desto höher die Wahrscheinlichkeit, dass der Begriff segmentiert wird.plaintext自然语言处理 3 n ServBay 5 eng 结巴分词库 3 n
1
2
3Beispiel:
3 n
hinter „自然语言处理“ bedeutet, das Wort hat die Häufigkeit 3 und die Wortart „Nomen“ (n
).5 eng
bei „ServBay“ steht für Häufigkeit 5 und Wortart Englisch (eng
).Konfigurieren Sie pg_jieba auf das benutzerdefinierte Wörterbuch: Legen Sie in Ihrer PostgreSQL-Session den Parameter
pg_jieba.dict_path
auf das Verzeichnis, in dem sich Ihr Wörterbuch befindet. Hinweis: Der Parameterpg_jieba.dict_path
zeigt in der Regel auf ein Verzeichnis, nicht auf eine einzelne Datei. Wenn sich Ihr eigenes Wörterbuch im gleichen Verzeichnis wie das Hauptwörterbuch oder im Standardverzeichnis von pg_jieba befindet, ist keine Anpassung nötig, oder ServBay hat spezielle Voreinstellungen. Prüfen Sie ggf. die ServBay-Dokumentation.Sollte ServBay die direkte Angabe der Wörterbuchdatei erlauben, oder befindet sich das Wörterbuch darin, kann die folgende Anweisung verwendet werden (bitte entsprechend anpassen):
sqlSET pg_jieba.dict_path = '/Applications/ServBay/etc/pg_jieba/'; -- Hauptwörterbuch plus custom_dict.txt im gleichen Verzeichnis angenommen
1oder, wenn das direkte Setzen auf die Wörterbuch-Datei möglich ist (ist von ServBay-Konfiguration abhängig):
sqlSET pg_jieba.dict_path = '/Applications/ServBay/etc/pg_jieba/custom_dict.txt'; -- Vorsicht: Prüfen Sie die tatsächliche Funktionsweise in Ihrer Installation
1Wichtig: Die Einstellung per
SET
gilt nur für die aktuelle Datenbank-Session. Für dauerhafte Gültigkeit ändern Sie diepostgresql.conf
und tragen den Parameter dort fest ein.
Wörterbuch neu laden
Nach bearbeiteten Änderungen am Wörterbuch oder an pg_jieba.dict_path
müssen Sie pg_jieba zum Neuladen der Wörterbücher auffordern.
Wörterbuch neu laden: Führen Sie folgende Funktion aus:
sqlSELECT jieba_reload_dict();
1Nach Erfolg werden ab jetzt die neuen oder geänderten Wörter berücksichtigt.
Häufig gestellte Fragen (FAQ)
Frage: Beim Ausführen von
CREATE EXTENSION pg_jieba;
erscheint der Fehler "extension 'pg_jieba' is not available". Was tun? Antwort: Das bedeutet in der Regel, dass die pg_jieba-Erweiterung nicht korrekt im Extension-Verzeichnis von PostgreSQL installiert ist, oder PostgreSQL sie nicht finden kann. In ServBay ist pg_jieba normalerweise vorinstalliert. Überprüfen Sie, ob Sie wirklich die PostgreSQL-Instanz von ServBay nutzen und die Installation intakt ist. Hilft das nicht, ServBay neu starten oder die ServBay-Logs prüfen.Frage: Das benutzerdefinierte Wörterbuch funktioniert nicht – was tun? Antwort: Prüfen Sie Folgendes:
- Ist der Pfad zur Wörterbuchdatei korrekt und hat der PostgreSQL-User Leserechte?
- Ist das Dateiformat korrekt? Pro Zeile ein Begriff, ggf. mit Häufigkeit und Wortart durch Leerzeichen getrennt.
- Haben Sie den Parameter
pg_jieba.dict_path
richtig gesetzt?SET
gilt jeweils nur pro Session; für permanente Wirkung:postgresql.conf
anpassen. - Haben Sie die Funktion
SELECT jieba_reload_dict();
benutzt, um das Wörterbuch neu zu laden? - Nach Änderung der
postgresql.conf
: Wurde PostgreSQL neu gestartet?
Frage: Die Volltextsuche liefert ungenaue Ergebnisse – woran kann das liegen? Antwort: Die Genauigkeit hängt von Segmentierung und Abfrage ab.
- Prüfen Sie die Segmentierung mit der Funktion
ts_debug('chinese', 'Ihr Text')
. So sehen Sie, wie diechinese
-Konfiguration den Text zerlegt. Damit erkennen Sie auch, ob eigene Wörterbücher greifen. - Passen Sie die Konfiguration für die Segmentierung an, indem Sie unwichtige Wortarten (z.B. Partikel, Satzzeichen usw.) aus der Mapping-Liste entfernen.
- Überprüfen Sie Ihre Suchabfrage: Sind Ihre Begriffe und Operatoren (
&
,|
,!
) imto_tsquery
korrekt gesetzt?
- Prüfen Sie die Segmentierung mit der Funktion
Zusammenfassung
pg_jieba
ist ein leistungsfähiges Werkzeug zur Umsetzung chinesischer Volltextsuche in PostgreSQL. Dank der in ServBay vorinstallierten Erweiterung können Entwickler lokale Umgebungen einfach für chinesische Segmentierung und Suche ausstatten. Über die hier vorgestellten Schritte kennen Sie nun die Installation von pg_jieba
, die Erstellung und Anpassung von Textsuche-Konfigurationen, die Basisabfrage der Volltextsuche sowie den Einsatz von eigenen Wörterbüchern zur Optimierung. Mit diesen Techniken steigern Sie die Durchsuchbarkeit von chinesischen Inhalten in Ihren Projekten erheblich.