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 | ||
---|---|---|
|
|
|
À 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 |