Eseguire la ricerca full-text con SQL Connect

Firebase SQL Connect supporta la ricerca a testo intero, 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 a testo intero al tuo servizio. Innanzitutto, aggiungi la direttiva @searchable alla String nello schema su 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 a testo intero 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 ottimizzare i risultati della ricerca a testo intero 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 in ordine 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 `language` nella direttiva @searchable:

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

Se specifichi la lingua corretta, PostgreSQL eseguirà uno stemming lessicale accurato e ti aiuterà ad assicurarti 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
  • estone
  • finlandese
  • francese
  • tedesco/tedesca
  • greco/greca
  • hindi
  • ungherese
  • indonesiano/indonesiana
  • irlandese
  • italiano/italiana
  • lituano/lituana
  • nepalese
  • norvegese
  • portoghese
  • rumeno/rumena/romeno/romena
  • russo/russa
  • serbo/serba
  • spagnolo
  • svedese
  • tamil
  • turco/turca
  • yiddish

Supportiamo tutte le lingue supportate dalla ricerca a testo intero di PostgreSQL. Utilizzando psql, puoi ottenere l'elenco completo con la query seguente.

SELECT cfgname FROM pg_ts_config;

Formato della query

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

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").
  • PHRASE corrisponde a una frase esatta ("cane marrone" corrisponderà a "il cane bianco e marrone", ma non a "cane marrone e bianco").
  • AVANZATE ti consente di creare query complesse utilizzando l'insieme completo di operatori tsquery.

Soglia di pertinenza

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

Tuttavia, se ritieni che la ricerca restituisca risultati non pertinenti, la soglia di pertinenza può filtrarli.

Per determinare un valore appropriato per la soglia di pertinenza, esegui alcune ricerche di test ed esamina _metadata.relevance:

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

Scegli una soglia che ometta i risultati che ritieni non pertinenti. Ecco come fare:

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

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

SQL Connect offre diversi modi per eseguire ricerche nel database.

Utilizza questa tabella per scegliere l'opzione giusta per il tuo caso d'uso.

Ricerca a testo intero Ricerca di somiglianza vettoriale Filtri di pattern di stringhe
Ideale per implementare la funzionalità di ricerca generale Ideale per trovare righe semanticamente simili (ad es. consigli o 'Altro simile') Ideale per corrispondenze di testo esatte o ricerche con espressioni regolari
Esegue lo stemming lessicale, che aiuta a trovare corrispondenze tra forme o tempi diversi della stessa parola Richiede Vertex AI Utilizza meno memoria e spazio su disco, poiché non richiede alcun 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
Ottime prestazioni con documenti più grandi Ottime prestazioni con documenti di grandi dimensioni Prestazioni inferiori durante la ricerca in documenti più grandi
Aggiunge un overhead di memoria e spazio di archiviazione per memorizzare una colonna generata e un indice per ogni ricerca