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 localiser 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 dans 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 <pluralType>_search champ à 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
}
}
Ajuster les résultats de la recherche en texte intégral
Vous pouvez ajuster 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 de nombreux arguments identiques à ceux utilisés pour les champs de liste de base
<pluralType> :
ordervous permet de modifier l'ordre des résultats. Si vous l'omettez, les résultats sont triés par ordre décroissant de pertinence.wherevous permet d'ajouter des filtres supplémentaires à la recherche (par exemple, rechercher uniquement des films d'un genre spécifique).limitpermet à la requête de ne renvoyer que les X premiers résultats.offsetpermet à la requête d'ignorer les X premiers résultats.distinctajoute 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 comportement avec l'argument de langue de la directive @searchable :
type Movie
@table {
title: String! @searchable(language: "french")
...
}
En spécifiant la langue appropriée, vous permettez à PostgreSQL d'effectuer une racinisation 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 | ||
|---|---|---|
|
|
|
Avec 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 du champ
<pluralType>_search.
query SearchMovies($query: String) @auth(level: PUBLIC) {
movies_search(query: $query, queryFormat: PHRASE) {
...
}
}
Il existe quatre options pour le format de requête :
- QUERY donne une sémantique familière aux moteurs de recherche Web (par exemple, 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 ("brown dog" correspond à "the brown and white dog" ou "the white and brown dog").
- PHRASE correspond à une expression exacte ("brown dog" correspond à "the white and brown dog", mais pas à "brown and white dog").
- AVANCÉ vous permet de créer des requêtes complexes à l'aide de l'ensemble complet d'opérateurs tsquery.
Seuil de pertinence
Définir un seuil de pertinence signifie que votre recherche ne renverra que les résultats supérieurs à une certaine valeur de pertinence. Dans de nombreux cas, vous n'aurez pas besoin de définir ce seuil : tout résultat dont la pertinence est supérieure à 0 sera un résultat 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 déterminer une valeur appropriée pour le seuil de pertinence, vous devez effectuer quelques recherches tests et examiner _metadata.relevance :
query SearchMovies($query: String) @auth(level: PUBLIC) {
movies_search(query: $query) {
id
title
_metadata {
relevance
}
...
}
}
Choisissez un seuil qui omet les résultats que vous jugez 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és vectorielles et les filtres de modèle de chaîne
Data Connect propose plusieurs façons d'effectuer des recherches dans votre base de données.
Utilisez ce tableau pour choisir la méthode adaptée à votre cas d'utilisation.
| Recherche en texte intégral | Recherche de similarités vectorielles | Filtres de modèle 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, recommandations ou « Plus d'articles de ce type ») | Idéal pour les correspondances exactes de texte ou les recherches d'expressions régulières |
| Effectue une racinisation lexicale, ce qui permet de faire correspondre différentes formes ou différents temps d'un 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é sur plusieurs colonnes d'une table | Ne fonctionne que pour une seule colonne à la fois | Peut être effectué sur plusieurs colonnes d'une table à 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 |