PostgreSQL Textsuche Parser mit der Grenzanalyse der ICU
Die erste Stufe der Volltextensuche ist das Parsen - Unterbrechungsdokumente und Abfragen von Texten in einzelne Token (verschiedene Wörter, Zahlen usw.). Es gibt jedoch Sprachen, in denen diese Aufgabe nicht so trivial ist. Das bekannteste Beispiel sind ostasiatische Sprachen (wie Chinesisch, Japanisch, Koreanisch und mehr) - wo Wörter normalerweise nicht durch Whitespace und Zeichensetzung getrennt werden. Ein weiteres Beispiel ist Hebräisch; Während Wörter durch Interpunktion getrennt sind, können einige Zeichen als Interpunktionsmarken angesehen werden oder nicht vom Kontext.
Der Standard -Parser, der im Subsystem des PostgreSQL -Volltextsuchs enthalten ist, liefert in diesen Fällen ziemlich unbefriedigende Ergebnisse. pg_icu_parser ist eine Erweiterung, die eine benutzerdefinierte Volltextsuche -Parser -Implementierung bietet, die Routinen für die Wörter -Wörter -Wörter -Grenzanalyse verwenden, um Token aus dem Quelltext zu extrahieren. Diese implementieren die in Anhang 29 des Unicode -Standards angegebenen Algorithmen und können in vielen Sprachen angemessene Ergebnisse liefern.
Derzeit muss pg_icu_parser aus dem Quellcode erstellt werden. Stellen Sie sicher, dass Sie Entwicklungsunterstützungsdateien (Header usw.) für PostgreSQL zur Verfügung haben.
Um zu bauen und zu installieren, führen Sie aus:
$ make install
Dies wird gegen die PostgreSQL -Installation erstellt und installiert, die durch die erste Instanz von pg_config im aktuellen Pfad festgelegt wird. Um eine bestimmte Installation (oder nicht im Pfad) abzuzielen:
$ make install PG_CONFIG=/path/to/pg_config
Die Erweiterung ist auch in PGXN erhältlich.
Um die Erweiterung in eine Datenbank zu laden, führen Sie den folgenden SQL -Befehl als Benutzer mit geeigneten Berechtigungen aus:
CREATE EXTENSION pg_icu_parser;Dadurch wird der benutzerdefinierte Textparser im aktuellen Schema registriert. Um dies zu verwenden, muss eine Textsuchkonfiguration erstellt werden, wie im PostgreSQL -Handbuch beschrieben. Zum Beispiel:
CREATE TEXT SEARCH CONFIGURATION sample (parser = icu_parser);
ALTER TEXT SEARCH CONFIGURATION sample ADD MAPPING FOR word WITH english_stem;
ALTER TEXT SEARCH CONFIGURATION sample ADD MAPPING FOR number , ideo, kana WITH simple; Die Token -Typen, die vom Parser emittiert werden können, sind word , number , kana , ideo und blank - diese übereinstimmen mit den von der Intensivstation unterstützten Wort -Break -Tags. Es gibt keine Einschränkungen, welche Wörterbücher verwendet werden können.
pg_icu_parser legt einen einzelnen Konfigurationsparameter frei:
pg_icu_parser.locale - String, optional. Das Gebietsschema in der Intensivstation für die Grenzanalyse -Routinen. Wenn nicht festgelegt, wird die Standardeinstellung zu en . In der Regel müssen diesen Parameter nicht festgelegt werden, da es keine Regeln zur Erkennung von Wortgrenzen gibt, die für das Gebietsschema empfindlich sind. Wie oben beschrieben, sind die Hauptstärke von pg_icu_parser gegenüber dem bereits in PostgreSQL integrierten default -Parser die besseren Tokenisierungsergebnisse in verschiedenen Sprachen. Darüber hinaus hängt pg_icu_parser nicht von der Ort des Datenbank oder dem zugrunde liegenden Betriebssystem für die Bestimmung eines Buchstabens ab.
Es gibt jedoch mehrere Kompromisse, die sich darauf bewusst sind, dass sich die Entscheidung auswirken kann, ob pg_icu_parser für einen bestimmten Anwendungsfall geeignet ist:
Der Standard-Parser kann eine Vielzahl von Mustern als Token erkennen, einschließlich URLs, E-Mail-Adressen, verschiedenen unterschiedlichen Arten von numerischen Werten usw. pg_icu_parser hingegen hat erheblich weniger Token-Typen (und die wenigen, die unterstützt werden, sind viel grob) und können keine komplexen Muster erkennen.
Im Moment unterstützt pg_icu_parser die Funktion ts_headline nicht . Vielleicht in Zukunft ...
pg_icu_parser ist viel langsamer als der default -Parser. Wenn jedoch die Servercodierung der Datenbank UTF-8 ist, wird ein schneller Pfad verwendet, wodurch der Overhead reduziert wird. Siehe den Benchmark -Abschnitt unten.
Als Erweiterung der Drittanbieter kann pg_icu_parser nur dort verwendet werden, wenn die postgreSQL -Installation vollständig stimmt. Das heißt, es kann wahrscheinlich nicht mit verwalteten PostgreSQL -Lösungen verwendet werden.
Der folgende nichtwissenschaftliche Benchmark kann ein Gefühl dafür vermitteln, wie sehr man sich verlangsamen kann, wenn man anstelle des Standardparsers pg_icu_parser verwendet. Das getestete Szenario ist eine Abfrage, um die Anzahl der Nicht-Blank-Token in jedem Dokument in einem Korpus zu zählen. Der verwendete Korpus ist der Haaretz Corpus, der aus 27.139 kurzen hebräischen Sprachartikeln besteht. Die Werte sind die durchschnittliche Ausführungszeit in Millisekunden von 10 Runden, wie von EXPLAIN ANALYZE :
| Servercodierung | default | pg_icu_parser | Verlangsamen |
|---|---|---|---|
| UTF-8 | 2,566.9974 | 2,884,3696 | -12,3% |
| ISO-8859-8 | 3,529,6487 | 5.059,3616 | -43,3% |
Natürlich können verschiedene Umgebungen und unterschiedliche Korpora unterschiedliche Ergebnisse erzielen, ymmv.
pg_icu_parser ist unter der Mozilla Public Lizenz 2.0 lizenziert.