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_usernamedurch Ihren PostgreSQL-Benutzernamen undyour_databasedurch den Namen Ihrer Datenbank. ServBay verwendet normalerweiseservbayoderpostgresals Standardbenutzer und -datenbank.bashpsql -U your_username -d your_database1Beispiel mit Standardbenutzer und -datenbank:
bashpsql -U servbay -d servbay1Erstellen 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_jiebaaktiviert ist: Mit folgendem Befehl listen Sie die in Ihrer Datenbank installierten Erweiterungen auf:sql\dx1Wird
pg_jiebagelistet, 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
chinesean und geben Siepg_jiebaals Parser vor.sqlCREATE TEXT SEARCH CONFIGURATION chinese (PARSER = pg_jieba);1Damit werden alle von PostgreSQL durchgeführten Segmentierungen mit
pg_jiebaverarbeitet.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örterbuchsimplezu. 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,lstehen für einige der vonpg_jiebaerkannten 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_tsvectormit Ihrerchinese-Konfiguration, um auf der Spaltecontenteinen GIN-Index zu erstellen.to_tsvector('chinese', content)konvertiert den Inhalt über die mitpg_jiebaverbundene 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 intsqueryfü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.txt1Dies 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.txtmit 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 n1
2
3Beispiel:
3 nhinter „自然语言处理“ bedeutet, das Wort hat die Häufigkeit 3 und die Wortart „Nomen“ (n).5 engbei „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_pathauf das Verzeichnis, in dem sich Ihr Wörterbuch befindet. Hinweis: Der Parameterpg_jieba.dict_pathzeigt 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 angenommen1oder, 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 Installation1Wichtig: Die Einstellung per
SETgilt nur für die aktuelle Datenbank-Session. Für dauerhafte Gültigkeit ändern Sie diepostgresql.confund 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_pathrichtig gesetzt?SETgilt jeweils nur pro Session; für permanente Wirkung:postgresql.confanpassen. - 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_tsquerykorrekt 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.
