- 12. Mai 2026
#lessonlearned – Facettierte Solr-Suche in Nuxt: Filter mit Tag-Exklusion nutzerfreundlich umsetzen
Eine gute Suche zeigt nicht nur Treffer an, sondern hilft Benutzern auch dabei, ihre Ergebnisse gezielt einzugrenzen. Besonders hilfreich sind dabei Filter mit Zählern, die anzeigen, wie viele Treffer pro Auswahlmöglichkeit verfügbar sind. In diesem Lesson Learned zeigen wir, wie wir eine facettierte Suche mit Apache Solr in einer Nuxt-Anwendung umgesetzt haben und warum die sogenannte Tag-Exklusion dabei ein entscheidender Baustein war.

Warum Facetten in der Suche so wichtig sind
In unserem Karriereportal können Benutzer Stellenangebote nach mehreren Kriterien filtern, zum Beispiel nach Karrierelevel, Fachbereich, Beschäftigungsart, Land, Stadt oder Remote-Typ.
Damit die Suche intuitiv bleibt, sollten die Filter nicht nur auswählbar sein, sondern auch direkt anzeigen, wie viele Ergebnisse hinter einer Option stehen. So erkennen Benutzer schon vor dem Klicken, welche Auswahl sinnvoll sein kann.
Genau hier kommt die Facettierung ins Spiel. Sie berechnet für bestimmte Felder, wie oft ein Wert in den Suchergebnissen vorkommt.
Die eigentliche Herausforderung bei aktiven Filtern
Problematisch wird es dann, wenn ein Filter bereits gesetzt ist. Ohne eine passende Konfiguration schränkt ein Filter nicht nur die Trefferliste ein, sondern auch die Zählung innerhalb desselben Filters.
Ein Beispiel:
Wenn im Karrierelevel bereits „Senior“ ausgewählt wurde, zeigt eine einfache Facettenberechnung oft nur noch „Senior (42)“ an. Andere Optionen wie „Junior“ oder „Entry“ verschwinden, obwohl sie für die Benutzer weiterhin relevant wären, etwa um die Auswahl zu ändern oder zu erweitern.
Für eine gute Benutzerführung ist das nicht ideal. Der Filter sollte weiterhin alle verfügbaren Optionen mit ihren Zählern anzeigen – nur eben so berechnet, als würde der Filter sich nicht selbst einschränken.
Unser Ansatz: Filter mit Tags versehen und bei der Facettierung gezielt ausschließen
Apache Solr bietet dafür eine sehr hilfreiche Funktion: Tags auf Filterabfragen in Kombination mit einer gezielten Ausklammerung bei der Facettenberechnung.
Die Idee dahinter ist einfach:
Jeder gesetzte Filter erhält ein eigenes Kennzeichen
Die zugehörige Facette wird so berechnet, als wäre genau dieser eine Filter gerade nicht aktiv
Dadurch bleibt die Trefferliste korrekt gefiltert, während die Zähler innerhalb des aktiven Filters weiterhin alle sinnvollen Auswahlmöglichkeiten anzeigen.
Filterabfragen mit Tags aufbauen
Im ersten Schritt versehen wir jede Filterabfrage mit einem Tag. In unserem Fall haben wir dafür die Solr-Feldnamen verwendet.
Ein vereinfachter Ausschnitt sieht so aus:
const SOLR_FIELD_MAP = {
careerLevel: 'entryLevel_stringS',
workingArea: 'functionArea_stringS',
employmentType: 'timeType_stringS',
country: 'allJobCountries_stringM',
city: 'allJobCities_stringM',
remoteType: 'remoteType_stringS'
}
for (const [filterKey, solrFieldName] of Object.entries(SOLR_FIELD_MAP)) {
const selectedTerms = rawValues.map(toTermString).filter(Boolean)
if (selectedTerms.length > 0) {
const orClause = buildOrClause(solrFieldName, selectedTerms)
filterQueries.push(`{!tag=${solrFieldName}}${orClause}`)
}
}Das Ergebnis ist dann zum Beispiel eine Filterabfrage wie diese:
fq={!tag=entryLevel_stringS}(entryLevel_stringS:"Senior" OR entryLevel_stringS:"Junior")Damit weiß Solr, zu welchem Feld dieser Filter gehört.
Facettenzähler gezielt ohne den eigenen Filter berechnen
Im zweiten Schritt wird bei der Definition der Facetten angegeben, dass die Zählung den eigenen Filter ausklammern soll.
const buildJsonFacet = () => {
const facets = {}
for (const [, solrFieldName] of Object.entries(SOLR_FIELD_MAP)) {
facets[solrFieldName] = {
type: 'terms',
field: solrFieldName,
limit: 100,
domain: { excludeTags: [solrFieldName] }
}
}
return facets
}Die Option excludeTags sorgt dafür, dass die Facette für ein bestimmtes Feld so berechnet wird, als wäre der gleichnamige Filter gerade nicht gesetzt.
Genau dadurch bleibt zum Beispiel der Karrierelevel-Filter weiterhin vollständig sichtbar, auch wenn bereits ein Karrierelevel ausgewählt wurde.
Die Facetten im Frontend nutzbar machen
Damit die Daten im Frontend sauber verarbeitet werden können, normalisieren wir die Rückgabe aus Solr in eine einfache Struktur aus Name und Trefferanzahl.
const normalizedFacets = {}
Object.values(SOLR_FIELD_MAP).forEach((field) => {
const buckets = responseJson.facets?.[field]?.buckets ?? []
normalizedFacets[field] = buckets.map((b) => ({
name: b.val,
count: b.count
}))
})So können die Facetten in der Oberfläche leicht angezeigt und weiterverarbeitet werden.
Filter mit der URL synchronisieren
Zusätzlich haben wir die aktiven Filter mit den URL-Parametern verknüpft. Das hat zwei große Vorteile:
Suchergebnisse lassen sich teilen
gefilterte Ansichten können als Lesezeichen gespeichert werden
Ein vereinfachtes Beispiel:
router.replace({
query: {
q: searchQuery,
careerLevel: selectedFilters.careerLevel.join(','),
country: selectedFilters.country.join(',')
}
})Gerade bei Such- und Karriereseiten ist das im Alltag sehr hilfreich, weil Benutzer Suchanfragen später erneut aufrufen oder weitergeben können.
Was sich für uns bewährt hat
Im Projekt hat sich vor allem gezeigt, dass eine gute Suchoberfläche nicht nur von der Qualität der Treffer abhängt, sondern auch von der Verständlichkeit der Filter.
Filterzähler dürfen sich nicht selbst „kaputtfiltern“
Wenn ein aktiver Filter seine eigenen Alternativen ausblendet, wirkt die Oberfläche schnell unvollständig oder verwirrend. Mit Tag-Exklusion bleibt die Auswahl nachvollziehbar.
Solr bietet dafür bereits die richtigen Werkzeuge
Die Kombination aus Tags auf Filterabfragen und excludeTags in der JSON-Facet-API ist dafür sehr gut geeignet. Man muss diese Logik nicht selbst nachbauen, sondern kann direkt auf die vorhandenen Solr-Funktionen setzen.
URL-Synchronisation verbessert die Nutzbarkeit deutlich
Gerade bei Suchergebnissen ist es sehr sinnvoll, den aktuellen Zustand der Filter in der URL sichtbar zu machen. Das erleichtert Teilen, Merken und erneutes Aufrufen.
Was wir daraus gelernt haben
Unser wichtigstes Learning war, dass eine facettierte Suche erst dann wirklich nutzerfreundlich wird, wenn Filter und Facetten logisch zusammenspielen. Solr liefert dafür mit Tag-Exklusion eine sehr elegante Lösung.
Durch die Kombination aus getaggten Filterabfragen, gezielt ausgeschlossenen Facetten und einer sauberen Aufbereitung im Frontend konnten wir eine Suche umsetzen, bei der Benutzer jederzeit sehen, welche Auswahlmöglichkeiten ihnen offenstehen. Das verbessert nicht nur die Bedienbarkeit, sondern schafft auch deutlich mehr Transparenz in der Ergebnismenge.