Volltextsuche mit Data Connect durchführen

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
  • einfach
  • Arabisch
  • Armenier / Armenierin / armenisch / Armenisch
  • Baske / Baskin / baskisch / Baskisch
  • Katalane / Katalanin / katalanisch / Katalanisch
  • dänisch / Dänisch
  • Niederländer / Niederländerin / Holländer / Holländerin / niederländisch / Niederländisch / holländisch / Holländisch
  • english
  • Finnisch / finnisch
  • französisch / Französisch
  • Deutscher / Deutsche / deutsch / Deutsch
  • Grieche / Griechin / griechisch / Griechisch
  • Hindi
  • Ungar / Ungarin / ungarisch / Ungarisch
  • Indonesier / Indonesierin / indonesisch / Indonesisch
  • irisch
  • Italiener / Italienerin / italienisch / Italienisch
  • Litauer / Litauerin / litauisch / Litauisch
  • Nepalese / Nepalesin / Nepali / nepalesisch / Nepalesisch
  • Norweger / Norwegerin / norwegisch / Norwegisch

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.