Postgres in Chinesisch oder Volltextsuche einrichten in Postgres für Chinesisch

    Bild

    Ein Kunde kontaktierte uns mit der Bitte, PostgreSQL auf die neueste Version zu aktualisieren und gleichzeitig Chinesisch zu unterrichten.
    Genauer gesagt, um den Prozess der Volltextsuche auf Chinesisch zu optimieren, weil sich das Ganze gnadenlos verlangsamt.

    Das Folgende beschreibt, wie wir das gemacht haben.
    Kommen wir gleich zur Sache.


    Der erste Schritt besteht darin, die einfache chinesische Wortsegmentierung (Simple Chinese Word Segmentation, SCWS) und die zhparser-SCWS-Erweiterung
    selbst zu erstellen und zu installieren
    wget -q -O - http://www.xunsearch.com/scws/down/scws-1.2.2.tar.bz2 | tar xf -
    cd scws-1.2.2 ; ./configure ; make install
    

    Jetzt zhparser
    github.com/amutu/zhparser - es gibt gleichzeitig eine vollwertige Anweisung, und wir machen es.
    git clone https://github.com/amutu/zhparser.git
    SCWS_HOME=/usr/local make && make install
    

    Wenn es erfolgreich war, aktivieren Sie die Erweiterung in der gewünschten Datenbank
    psql -U postgres -d test_dbname -c 'CREATE EXTENSION zhparser'
    

    Wechseln Sie anschließend zur gewünschten Datenbank und erstellen Sie die Konfiguration
    test_dbname=# CREATE TEXT SEARCH CONFIGURATION testzhcfg (PARSER = zhparser);
    test_dbname=# ALTER TEXT SEARCH CONFIGURATION testzhcfg ADD MAPPING FOR n,v,a,i,e,l WITH simple;
    

    Nehmen wir an, wir haben bereits eine Tabelle mit Daten.
    CREATE TABLE messages (
        title       text,
        body        text
    );
    

    Und wir müssen die Spalten nach Titel und Text durchsuchen. Lass es eine solche Aufzeichnung geben
    INSERT INTO messages VALUES('批发新', '款新婴幼');
    

    Dazu müssen wir die tsv-Spalte mit dem tsvector-Typ für Tokens hinzufügen.
    test_dbname=# ALTER TABLE messages ADD COLUMN tsv tsvector;
    

    Wir hängen daran den Gin-Index (https://ru.wikipedia.org/wiki/GIN)
    test_dbname=# CREATE INDEX tsv_idx ON messages USING gin(tsv);
    

    Erstellen Sie jetzt einen Auslöser für die automatische Aktualisierung von Tokens in der Spalte tsv mit unserer zuvor erstellten Konfiguration public.testzhcfg.
    test_dbname=# CREATE TRIGGER tsvectorupdate BEFORE INSERT OR UPDATE  ON messages FOR EACH ROW EXECUTE PROCEDURE tsvector_update_trigger( tsv, 'public.testzhcfg', title, body );
    

    Und der letzte Schritt.
    Wir müssen die tsv-Spalte mit unserem neuen Trigger aktualisieren. (und wie wir sehen, wird es beim Einfügen und Aktualisieren aktiviert), dazu schreiben wir durch UPDATE die aktuellen Werte der Titel- und Textfelder um, die gleichen Werte.
    test_dbname=# UPDATE messages SET title=title, body=body;
    

    Sie können den
    SELECT-Titel probieren . Body FROM messages WHERE tsv @@ to_tsquery ('批 & 款');

    Fragen, Anregungen und Vorschläge schreiben Sie in die Kommentare.
    Vielen Dank für Ihre Aufmerksamkeit!

    Jetzt auch beliebt: