Benutzerdefiniertes Wörterbuch für die Volltextsuche in Postgres

Hier also eine Geschichte über meine Suche, die Suche auf einer tschechischen Forum-Instanz zu verbessern.

Leider enthält die aktuelle PostgreSQL-Version (12) kein integriertes tschechisches Wörterbuch. Die tschechische Sprache verfügt über 7 Deklinationen (d. h. ein Substantiv kann je nach Kontext 7 verschiedene Formen annehmen), wie Sie sich vorstellen können, funktioniert die Suche für uns daher ziemlich schlecht.

Ich habe herausgefunden, wie man das Wörterbuch hinzufügt und innerhalb der Docker-Instanz zum Laufen bringt (Details unten), aber selbst nach einem Neuindexieren funktionierte es immer noch nicht. Es stellte sich heraus, dass Discourse das Wörterbuch basierend auf der Einstellung default_locale auswählt und es nur für die Sprachen aktiviert, die mit PostgreSQL ausgeliefert werden – für alle anderen wird das simple-Wörterbuch verwendet.

Bitte, bitte, können wir eine zusätzliche Site-Einstellung hinzufügen, um ein benutzerdefiniertes Suchwörterbuch anzugeben?
Ich habe überprüft, dass alles funktioniert, sobald ich lib/search.rb manuell bearbeite.

Hier ist, was ich getan habe, um das Wörterbuch hinzuzufügen, im Wesentlichen eine Wiederholung der Schritte von hier:

und hier:

sudo ./launcher enter app
# Das Folgende sollte auch zu container/app.yml hinzugefügt werden, damit es bei jedem Container-Neuaufbau ausgeführt wird
curl -L https://github.com/freaz/docker-postgres-czech-unaccent/raw/master/czech_unaccent.tar.gz | tar -xzC /tmp/ && mv /tmp/fulltext_dicts/czech* /usr/share/postgresql/1?/tsearch_data/
sudo -u postgres psql discourse
CREATE TEXT SEARCH DICTIONARY czech
   (template=ispell, dictfile = czech_unaccent, afffile=czech_unaccent, stopwords=czech_unaccent);
CREATE TEXT SEARCH CONFIGURATION czech (copy=english);
ALTER TEXT SEARCH CONFIGURATION czech
  ALTER MAPPING FOR word, asciiword WITH cspell, simple;
# Überprüfen
\dF
# Test
select * from ts_debug('czech_unaccent','Prilis zlutoucky kun se napil zlute vody');
Ctrl-D
rake search:reindex
Ctrl-D
# In containers/app.yml setzen
db_default_text_search_config: "public.czech"
# neu aufbauen

Es gibt noch eine weitere Tücke bei den Diakritika. Der oben beschriebene Ansatz lädt ein Wörterbuch ohne Diakritika herunter, sodass es zusammen mit der Einstellung search ignore accents funktioniert, wenn diese aktiviert ist. Wenn Sie mit Diakritika suchen möchten, sollten Sie das Wörterbuch von https://postgres.cz/data/czech.tar.gz herunterladen.

Ich denke, dass diese Tücke auch für andere Sprachen mit Standard-Postgres-Unterstützung gilt. :frowning: Wenn Sie Akzente entfernen, schalten Sie im Wesentlichen den Stemmer für Ihre Sprache für Wörter mit diakritischen Zeichen aus. Es ist also keineswegs klar, ob diese Funktion für diese Sprachen aktiviert sein sollte.

4 „Gefällt mir“

@sam, wärst du offen für einen PR dazu?

Alternativ könnten wir das Docker-Basis-Image so anpassen, dass es standardmäßig mehr Postgres-Suchwörterbücher enthält, aber das wäre deutlich aufwendiger.