Effectuer une recherche en texte intégral avec Data Connect

Firebase Data Connect est compatible avec la recherche en texte intégral, optimisée par PostgreSQL. La recherche en texte intégral vous permet de trouver rapidement et efficacement des informations dans de grands ensembles de données en recherchant des mots clés et des expressions dans plusieurs colonnes à la fois.

Vous pouvez ajouter la recherche en texte intégral à votre service. Commencez par ajouter la directive @searchable à la String de votre schéma sur laquelle vous souhaitez effectuer une recherche. Exemple :

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
}

Une fois cette directive ajoutée, vous pouvez effectuer une recherche en texte intégral en ajoutant le champ <pluralType>_search à une requête. Dans ce cas, il s'agit de movies_search :

query SearchMovies($query: String) @auth(level: PUBLIC) {
  movies_search(query: $query) {
    id
    title
    imageUrl
    releaseYear
    genre
    rating
    tags
    description
  }
}

Affinage des résultats de recherche en texte intégral

Vous pouvez affiner les résultats de la recherche en texte intégral en ajoutant des arguments à la directive @searchable et au champ _search.

Arguments partagés

Vous pouvez contrôler les résultats de recherche avec la plupart des arguments utilisés pour les champs de liste de base <pluralType> :

  • order vous permet de modifier l'ordre des résultats. Si cette valeur n'est pas spécifiée, les résultats seront triés par pertinence décroissante.
  • where vous permet d'ajouter des filtres supplémentaires à la recherche (par exemple, rechercher uniquement les films d'un genre spécifique).
  • limit permet à la requête de ne renvoyer que les X premiers résultats.
  • offset permet à la requête d'ignorer les X premiers résultats.
  • distinct ajoute l'opérateur DISTINCT au code SQL généré.

Choix de la langue

Par défaut, la recherche en texte intégral analyse les documents en anglais. Vous pouvez modifier ce paramètre avec l'argument de langue sur la directive @searchable :

type Movie
  @table {
  title: String! @searchable(language: "french")
  ...
}

En spécifiant la langue appropriée, vous permettez à PostgreSQL d'effectuer une analyse lexicale précise et de vous assurer que votre recherche ne manque pas de résultats pertinents. Si vous effectuez une recherche dans plusieurs colonnes, elles doivent toutes être définies sur la même langue.

Langues
  • simple
  • arabic
  • arménien
  • basque
  • catalan
  • danois
  • néerlandais
  • english
  • finlandais
  • français
  • allemand
  • grecque
  • hindi
  • hongrois
  • indonésien
  • irlandais
  • italien
  • lituanien
  • musique népalaise
  • norvégien

À l'aide de psql, vous pouvez obtenir la liste complète avec la requête suivante.

SELECT cfgname FROM pg_ts_config;

Format de requête

Par défaut, la recherche en texte intégral utilise la sémantique Web pour les requêtes (comme la recherche Google). Vous pouvez modifier ce comportement avec l'argument queryFormat sur le champ <pluralType>_search.

query SearchMovies($query: String) @auth(level: PUBLIC) {
  movies_search(query: $query, queryFormat: PHRASE) {
    ...
  }
}

Quatre options de format de requête sont disponibles :

  • QUERY offre une sémantique familière aux moteurs de recherche sur le Web (par exemple, les chaînes entre guillemets, AND et OR). Il s'agit de la valeur par défaut.
  • PLAIN correspond à tous les mots, mais pas nécessairement ensemble ("chien marron" correspondra à "le chien marron et blanc" ou "le chien blanc et marron").
  • PHRASE correspond à une expression exacte ( "chien marron" correspond à "le chien blanc et marron", mais pas à "chien marron et blanc").
  • AVANCÉ vous permet de créer des requêtes complexes à l'aide de l'ensemble complet des opérateurs tsquery.

Seuil de pertinence

Définir un seuil de pertinence signifie que votre recherche ne renverra que les résultats dont la valeur de pertinence est supérieure à un certain seuil. Dans de nombreux cas, vous n'aurez pas besoin de définir cette valeur. Tout résultat dont la pertinence est supérieure à 0 sera considéré comme pertinent.

Toutefois, si vous constatez que votre recherche renvoie des résultats qui ne vous semblent pas pertinents, le seuil de pertinence peut les filtrer pour vous.

Pour déterminer une valeur appropriée pour le seuil de pertinence, vous devez effectuer quelques recherches de test et examiner le _metadata.relevance :

query SearchMovies($query: String) @auth(level: PUBLIC) {
  movies_search(query: $query) {
    id
    title
    _metadata {
      relevance
    }
    ...
  }
}

Choisissez un seuil qui exclut les résultats qui vous semblent non pertinents. Pour ce faire :

query SearchMovies($query: String) @auth(level: PUBLIC) {
  movies_search(query: $query, relevanceThreshold: 0.05) {
    id
    title
    ...
  }
}

Choisir entre la recherche en texte intégral, la recherche de similarité vectorielle et les filtres de modèle de chaîne

Data Connect propose plusieurs façons de rechercher des informations dans votre base de données.

Utilisez ce tableau pour choisir celui qui convient le mieux à votre cas d'utilisation.

Recherche en texte intégral Recherche de similarité vectorielle Filtres de modèles de chaîne
Idéal pour implémenter une fonctionnalité de recherche générale Idéal pour trouver des lignes sémantiquement similaires (par exemple, des recommandations ou des suggestions "Plus d'articles comme celui-ci") Idéal pour les correspondances exactes ou les recherches par expression régulière
Effectue une racinisation lexicale, qui permet de faire correspondre différentes formes ou différents temps du même mot Nécessite Vertex AI Utilise le moins de mémoire et d'espace disque, car il ne nécessite aucun index ni aucune colonne générée.
Peut être effectuée sur plusieurs colonnes d'un tableau Ne fonctionne que pour une seule colonne à la fois Peut être effectuée sur plusieurs colonnes d'un tableau à l'aide de filtres OR
Performant sur les documents volumineux Performant sur les documents volumineux Moins performant lors de la recherche dans des documents volumineux
Ajoute une surcharge de mémoire et de stockage pour stocker une colonne générée et un index pour chaque recherche