Firebase Data Connect unterstützt die Volltextsuche, die auf PostgreSQL basiert. Mit der Volltextsuche können Sie schnell und effizient Informationen in großen Datasets finden, indem Sie gleichzeitig in mehreren Spalten nach Keywords und Begriffen suchen.
Sie können Ihrem Dienst die Volltextsuche hinzufügen. Fügen Sie zuerst die @searchable
-Anweisung zum String
in Ihrem Schema hinzu, das durchsucht werden soll. Beispiel:
type Movie
@table {
# The fields you want to search over
title: String! @searchable
genre: String @searchable
description: String @searchable
tags: [String]
# Some other fields that we won't search over
rating: Float
imageUrl: String!
releaseYear: Int
}
Nachdem Sie diese Direktive hinzugefügt haben, können Sie eine Volltextsuche durchführen, indem Sie das Feld <pluralType>_search
einer Abfrage hinzufügen. In diesem Fall ist es movies_search
:
query SearchMovies($query: String) @auth(level: PUBLIC) {
movies_search(query: $query) {
id
title
imageUrl
releaseYear
genre
rating
tags
description
}
}
Volltextsuchergebnisse optimieren
Sie können die Volltextsuchergebnisse optimieren, indem Sie der @searchable
-Anweisung und dem _search
-Feld Argumente hinzufügen.
Gemeinsame Argumente
Sie können die Suchergebnisse mit vielen der Argumente steuern, die für einfache Listenfelder verwendet werden <pluralType>
:
- Mit
order
können Sie die Reihenfolge der Ergebnisse ändern. Wird kein Wert angegeben, werden die Ergebnisse in absteigender Reihenfolge nach Relevanz sortiert. - Mit
where
können Sie zusätzliche Filter für die Suche hinzufügen, z.B. nur nach Filmen eines bestimmten Genres suchen. - Mit
limit
werden nur die X besten Ergebnisse zurückgegeben. - Mit
offset
werden die ersten X Ergebnisse der Abfrage übersprungen. distinct
fügt der generierten SQL-Anweisung den DISTINCT-Operator hinzu.
Sprachauswahl
Standardmäßig werden Dokumente für die Volltextsuche auf Englisch analysiert. Sie können dies mit dem Sprachargument in der @searchable
-Anweisung ändern:
type Movie
@table {
title: String! @searchable(language: "french")
...
}
Wenn Sie die richtige Sprache angeben, kann PostgreSQL eine genaue lexikalische Stammformbildung durchführen und dafür sorgen, dass bei Ihrer Suche keine relevanten Ergebnisse fehlen. Wenn Sie in mehreren Spalten suchen, muss für alle Spalten dieselbe Sprache festgelegt sein.
Sprachen | ||
---|---|---|
|
|
|
Mit psql
können Sie die vollständige Liste mit der folgenden Abfrage abrufen.
SELECT cfgname FROM pg_ts_config;
Abfrageformat
Standardmäßig wird bei der Volltextsuche die Websemantik für Anfragen verwendet (ähnlich der Google-Suche). Sie können dieses Verhalten mit dem Argument queryFormat
im Feld <pluralType>_search
ändern.
query SearchMovies($query: String) @auth(level: PUBLIC) {
movies_search(query: $query, queryFormat: PHRASE) {
...
}
}
Es gibt vier Optionen für das Anfrageformat:
- QUERY bietet vertraute Semantik für Websuchmaschinen (z.B. in Anführungszeichen gesetzte Strings, AND und OR). Das ist die Standardeinstellung.
- PLAIN: Alle Wörter müssen enthalten sein, aber nicht unbedingt zusammenhängend. „brauner Hund“ stimmt mit „der braune und weiße Hund“ oder „der weiße und braune Hund“ überein.
- PHRASE: Sucht nach einer genauen Wortgruppe („brauner Hund“ findet „der weiße und braune Hund“, aber nicht „brauner und weißer Hund“).
- Mit ADVANCED können Sie komplexe Abfragen mit allen tsquery-Operatoren erstellen.
Relevanzschwellenwert
Wenn Sie einen Relevanzschwellenwert festlegen, werden in Ihrer Suche nur Ergebnisse mit einem bestimmten Relevanzwert zurückgegeben. In vielen Fällen müssen Sie diese Einstellung nicht vornehmen. Alle Ergebnisse mit einer Relevanz von mehr als 0 sind relevant.
Wenn Sie jedoch feststellen, dass Ihre Suche Ergebnisse liefert, die nicht relevant sind, können Sie diese mit dem Relevanzschwellenwert herausfiltern.
Um einen geeigneten Wert für den Relevanzschwellenwert zu ermitteln, sollten Sie einige Testsuchen durchführen und sich die _metadata.relevance
ansehen:
query SearchMovies($query: String) @auth(level: PUBLIC) {
movies_search(query: $query) {
id
title
_metadata {
relevance
}
...
}
}
Wählen Sie einen Grenzwert aus, mit dem Ergebnisse ausgeschlossen werden, die Sie für irrelevant halten. Anleitung:
query SearchMovies($query: String) @auth(level: PUBLIC) {
movies_search(query: $query, relevanceThreshold: 0.05) {
id
title
...
}
}
Zwischen Volltextsuche, Suche nach Vektorähnlichkeit und Filtern nach Stringmustern wählen
Data Connect bietet verschiedene Möglichkeiten, in Ihrer Datenbank zu suchen.
Anhand dieser Tabelle können Sie das richtige Produkt für Ihren Anwendungsfall auswählen.
Volltextsuche | Vektorähnlichkeitssuche | Filter für Stringmuster |
---|---|---|
Gut für die Implementierung allgemeiner Suchfunktionen | Gut geeignet, um semantisch ähnliche Zeilen zu finden (z. B. Empfehlungen oder „Mehr wie dieses“) | Gut für exakte Textübereinstimmungen oder Suchen mit regulären Ausdrücken |
Führt lexikalisches Stemming durch, um verschiedene Formen oder Zeitformen desselben Wortes abzugleichen. | Vertex AI ist erforderlich | Verwendet am wenigsten Arbeitsspeicher und Festplattenspeicher, da keine Indexe oder generierten Spalten erforderlich sind. |
Kann für mehrere Spalten in einer Tabelle ausgeführt werden | Funktioniert jeweils nur für eine einzelne Spalte | Kann mit ODER-Filtern für mehrere Spalten in einer Tabelle ausgeführt werden |
Leistungsstark bei größeren Dokumenten | Leistungsstark bei großen Dokumenten | Weniger leistungsstark bei der Suche in größeren Dokumenten |
Fügt Speicher- und Speicherplatz-Overhead hinzu, um eine generierte Spalte und einen Index für jede Suche zu speichern. |