Eseguire la ricerca a testo intero con Data Connect

Firebase Data Connect supporta la ricerca full-text, basata su PostgreSQL. La ricerca a testo intero ti consente di individuare in modo rapido ed efficiente le informazioni all'interno di set di dati di grandi dimensioni cercando parole chiave e frasi in più colonne contemporaneamente.

Puoi aggiungere la ricerca full-text al tuo servizio. Innanzitutto, aggiungi la direttiva @searchable a String nello schema in cui vuoi eseguire la ricerca. Ad esempio:

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
}

Dopo aver aggiunto questa direttiva, puoi eseguire la ricerca full-text aggiungendo il campo <pluralType>_search a una query. In questo caso, sarà movies_search:

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

Ottimizzare i risultati della ricerca a testo intero

Puoi perfezionare i risultati della ricerca full-text aggiungendo argomenti alla direttiva @searchable e al campo _search.

Argomenti condivisi

Puoi controllare i risultati di ricerca con molti degli stessi argomenti utilizzati per i campi di elenco di base <pluralType>:

  • order ti consente di modificare l'ordine dei risultati. Se omesso, i risultati verranno ordinati in base alla pertinenza decrescente.
  • where ti consente di aggiungere filtri aggiuntivi alla ricerca (ad es. cercare solo film di un genere specifico).
  • limit fa in modo che la query restituisca solo i primi X risultati.
  • offset fa in modo che la query salti i primi X risultati.
  • distinct aggiunge l'operatore DISTINCT all'SQL generato.

Scelta della lingua

Per impostazione predefinita, la ricerca a testo intero analizza i documenti in inglese. Puoi modificare questa impostazione con l'argomento della lingua nella direttiva @searchable:

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

Se specifichi la lingua corretta, PostgreSQL può eseguire un'estrazione accurata dei temi lessicali e contribuire a garantire che la ricerca non perda risultati pertinenti. Se esegui la ricerca in più colonne, tutte devono essere impostate sulla stessa lingua.

Lingue
  • semplice
  • arabo
  • armeno/armena
  • basco/basca
  • catalano/catalana
  • danese
  • olandese
  • english
  • finlandese
  • francese
  • tedesco/tedesca
  • greco/greca
  • hindi
  • ungherese
  • indonesiano/indonesiana
  • irlandese
  • italiano/italiana
  • lituano/lituana
  • nepalese
  • norvegese

Utilizzando psql, puoi ottenere l'elenco completo con la seguente query.

SELECT cfgname FROM pg_ts_config;

Formato della query

Per impostazione predefinita, la ricerca a testo intero utilizza la semantica web per le query (in modo simile alla ricerca Google). Puoi modificare questo comportamento con l'argomento queryFormat nel campo <pluralType>_search.

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

Esistono quattro opzioni per il formato della query:

  • QUERY fornisce una semantica familiare ai motori di ricerca web (ad es. stringhe tra virgolette, AND e OR). È l'impostazione predefinita.
  • PLAIN corrisponde a tutte le parole, ma non necessariamente insieme ("cane marrone" corrisponderà a "il cane marrone e bianco" o "il cane bianco e marrone").
  • FRASE corrisponde a una frase esatta ( "cane marrone" corrisponderà a "il cane bianco e marrone", ma non a "cane marrone e bianco").
  • AVANZATA ti consente di creare query complesse utilizzando l'intero insieme di operatori tsquery.

Soglia di pertinenza

L'impostazione di una soglia di pertinenza significa che la ricerca restituirà solo risultati al di sopra di un determinato valore di pertinenza. In molti casi, non è necessario impostare questo valore: qualsiasi risultato con una pertinenza maggiore di 0 sarà un risultato pertinente.

Tuttavia, se la ricerca restituisce risultati che non ti sembrano pertinenti, la soglia di pertinenza può filtrarli.

Per determinare un valore appropriato per la soglia di pertinenza, devi eseguire alcune ricerche di test e osservare _metadata.relevance:

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

Scegli una soglia che escluda i risultati che ritieni irrilevanti. Per farlo:

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

Scegliere tra ricerca a testo intero, ricerca di similarità vettoriale e filtri di pattern di stringhe

Data Connect offre diversi modi per eseguire ricerche nel database.

Utilizza questa tabella per scegliere quello giusto per il tuo caso d'uso.

Ricerca a testo intero Ricerca di similarità vettoriale Filtri basati su pattern di stringa
Ideale per implementare la funzionalità di ricerca generale Ideale per trovare righe semanticamente simili (ad esempio, consigli o "Altri contenuti simili") Ideale per corrispondenze esatte del testo o ricerche tramite espressioni regolari
Esegue la derivazione lessicale, che consente di trovare corrispondenze tra forme o tempi diversi della stessa parola Richiede Vertex AI Utilizza meno memoria e spazio su disco, poiché non richiede indici o colonne generate
Può essere eseguita su più colonne di una tabella Funziona solo per una singola colonna alla volta Può essere eseguita su più colonne di una tabella utilizzando i filtri OR
Prestazioni migliori con documenti più grandi Prestazioni elevate su documenti di grandi dimensioni Meno efficiente durante la ricerca in documenti più grandi
Aggiunge l'overhead di memoria e spazio di archiviazione per memorizzare una colonna generata e un indice per ogni ricerca