Wagtail-Suche verbessern: PostgreSQL Full-Text & Elasticsearch
"Die Suche findet nichts Vernünftiges" — ein häufiger Grund, warum ich zu bestehenden Wagtail-Sites gerufen werde. Meist läuft noch das Datenbank-Backend mit simpler Teilstring-Suche. Hier der Weg zu einer echten Volltextsuche.
Die Search-Backends im Überblick
- Datenbank (Standard): einfach, aber kein echtes Ranking, keine Stemming-Sprachunterstützung
- PostgreSQL Full-Text: gutes Ranking, Stemming, kostenlos — ideal für die meisten Sites
- Elasticsearch: maximale Relevanz und Skalierung, aber eigener Dienst zu betreiben
Meine Faustregel: PostgreSQL Full-Text deckt die allermeisten Wagtail-Sites vollständig ab. Elasticsearch erst, wenn Datenmenge oder Suchansprüche es wirklich verlangen.
PostgreSQL Full-Text einrichten
# settings.py
WAGTAILSEARCH_BACKENDS = {
"default": {
"BACKEND": "wagtail.search.backends.database",
"SEARCH_CONFIG": "german", # deutsches Stemming!
}
}
# Bei PostgreSQL nutzt das database-Backend automatisch
# die native Full-Text-Search inkl. Ranking.Nach der Umstellung den Suchindex neu aufbauen:
python manage.py update_indexSuchfelder & Boosting definieren
Welche Felder durchsucht werden — und wie stark sie gewichtet sind — legst du am Modell fest. Ein Treffer im Titel soll mehr zählen als im Fließtext:
from wagtail.search import index
class BlogPage(Page):
intro = models.TextField()
body = StreamField(...)
search_fields = Page.search_fields + [
index.SearchField("intro", boost=2),
index.SearchField("body"),
index.FilterField("date"), # zum Filtern, nicht Suchen
]# Suche im Code
from wagtail.models import Page
results = Page.objects.live().search("django performance", operator="and")
# Nur bestimmter Seitentyp
results = BlogPage.objects.live().search(query)Autocomplete
Für Suchvorschläge während der Eingabe braucht es AutocompleteField:
from wagtail.search import index
class BlogPage(Page):
search_fields = Page.search_fields + [
index.AutocompleteField("title"),
index.SearchField("body"),
]
# View
results = BlogPage.objects.live().autocomplete(request.GET.get("q", ""))Wann Elasticsearch?
Elasticsearch lohnt sich bei sehr großen Inhaltsmengen, facettierter Suche oder wenn du Relevanz sehr fein steuern willst. Die Umstellung ist unkompliziert — nur das Backend und ein laufender Dienst:
pip install "wagtail[elasticsearch]"
WAGTAILSEARCH_BACKENDS = {
"default": {
"BACKEND": "wagtail.search.backends.elasticsearch8",
"URLS": ["http://localhost:9200"],
"INDEX": "wagtail",
}
}
# danach: python manage.py update_indexDer Code in den Views bleibt gleich — .search() funktioniert unabhängig vom Backend. Das ist die Stärke von Wagtails Suchabstraktion: Backend wechseln ohne Code-Änderung.
Fazit
Der schnellste Gewinn für fast jede Wagtail-Site: vom Datenbank-Standard auf PostgreSQL Full-Text mit deutschem Stemming und Feld-Boosting wechseln. Das ist wenig Aufwand und hebt die Suchqualität spürbar. Elasticsearch bleibt die Option für die großen Fälle — dank Wagtails Abstraktion ohne Code-Umbau.
