Utilizzare le query di testo

Utilizza le funzionalità di ricerca di testo in Firestore con compatibilità MongoDB per cercare stringhe specifiche all'interno di una raccolta.

Prima di iniziare

Prima di iniziare a utilizzare le query di testo, segui questi passaggi:

  1. Assicurati di avere accesso a un database operativo compatibile con MongoDB esistente oppure crea un database e connettiti a esso.

  2. Assicurati di avere un indice di testo o crea un indice di testo.

Autorizzazioni IAM

Per creare un indice in Firestore con compatibilità MongoDB, assicurati di avere assegnato uno dei seguenti ruoli:

  • roles/datastore.owner
  • roles/datastore.indexAdmin
  • roles/editor
  • roles/owner

Per concedere un ruolo, consulta Concedi un singolo ruolo. Per saperne di più sui ruoli Firestore e sulle autorizzazioni associate, consulta Ruoli predefiniti.

Se hai definito ruoli personalizzati, assegna tutte le seguenti autorizzazioni per creare indici:

  • datastore.indexes.create
  • datastore.indexes.delete
  • datastore.indexes.get
  • datastore.indexes.list
  • datastore.indexes.update

Eseguire una query di testo

Le query di testo utilizzano l'operatore $text all'interno di un filtro. Specifica la stringa sottoposta a query nell'argomento $search.

Eseguire una query di testo generica

Esegui la seguente query per eseguire una query generale:

  # Find query
  db.cities.find({ $text: { $search: "french bread" } })

  # Aggregation query
  db.cities.aggregate([
    { $match: { $text: { $search: "french bread" } } }
  ]);

Se l'indice è partizionato, puoi filtrare in base alla partizione includendola in un filtro di uguaglianza "and" all'interno della query. Ad esempio, se hai una partizione city, puoi filtrare una query di testo come segue:

db.myCollection.find( { $and: [
  { $text: { $search: "french bread" } },
  { "city": "Paris" }
] } )

Puoi anche filtrare un'aggregazione in base a una partizione. Ad esempio:

db.myCollection.aggregate([
 { $match: { $text: { $search: "french bread" } } },
 { "city": "Paris" }
] );

Il valore della partizione deve essere una stringa. Il filtro di partizionamento deve essere unito alla query utilizzando "and".

Impostare il linguaggio di query

Puoi impostare la lingua della query utilizzando l'argomento $language. Ad esempio:

  db.cities.find({ $text: { $search: "french bread", $language: "en"} })

Se non imposti la lingua della query, la query utilizza la lingua dell'indice di testo.

Eseguire una query per un termine esatto

Per eseguire una query su un termine esatto, configura il termine come una sequenza di parole racchiuse tra virgolette doppie. Ad esempio:

  # Find query
  db.cities.find({ $text: { $search: "\"best french bread\"" } })

  # Aggregation query
  db.cities.aggregate([
    { $match: { $text: { $search: "\"best french bread\"" } } },
  ]);

Eseguire una query su una combinazione di termini

Per rendere più precisa la query, specifica una catena di termini. Ad esempio, la seguente query restituisce i documenti che corrispondono alla combinazione best AND french AND ("bread" OR "is"):

  # Find query
  db.cities.find({ $text: { $search: "\"best\" \"french\" bread is" } })

  # Aggregation query
  db.cities.aggregate([
    { $match: { $text: { $search: "\"best\" \"french\" bread is" } } },
  ]);

Escludere un termine

Per escludere un termine da una query, anteponi un trattino (-) al termine:

  # Find query
  db.cities.find({ $text: { $search: "best bread -french"} })

  # Aggregation query
  db.cities.aggregate([
    { $match: { $text: { $search: "best bread -french" } } },
  ]);

Calcolare il punteggio di pertinenza

Utilizza l'espressione {$meta: "textScore"} per calcolare il punteggio di pertinenza dei documenti corrispondenti alla query di testo. Per ordinare i risultati in ordine decrescente del punteggio, utilizza $meta in un'espressione di ordinamento. Considera i seguenti esempi, dove SCORE_FIELD è il nome del campo utilizzato per memorizzare il valore del punteggio:

  # Find query
  db.cities
    .find({ $text: { $search: "best french bread" } })
    .sort({ SCORE_FIELD: { $meta: "textScore" } })

  # Aggregation query
  db.cities.aggregate([
    { $match: { $text: { $search: "best french bread" } } },
    { $sort: { "SCORE_FIELD": { $meta: "textScore"} } },
  ]);

Puoi anche utilizzare il punteggio di testo nelle espressioni di proiezione. Ad esempio:

  # Find query
  db.cities
    .find({ $text: { $search: "best french bread" } })
    .project({ score: { $meta: "textScore" } })

  # Aggregation query
  db.cities.aggregate([
    { $match: { $text: { $search: "best french bread" } } },
    { $project: { "scoreField": { $meta: "textScore"} } },
  ]);

Espandi query

Per migliorare la pertinenza dei risultati delle query, l'operatore $text aumenta la stringa di ricerca in base alla lingua specificata per includere corrispondenze per sinonimi sensibili al contesto, forme derivate, termini con correzione ortografica, varianti diacritiche e altro ancora.

Limitazioni

  • Gli operatori $near e $text non possono essere utilizzati nella stessa query.
  • È consentito un solo operatore $text per query find o aggregation.
  • Nelle aggregazioni, la fase $match con $text deve essere la prima fase della pipeline.
  • $text può essere nidificato solo all'interno di $and e $or.
  • Se $text si trova all'interno di $or, le disgiunzioni non di ricerca possono utilizzare indici ordinati esistenti per ottimizzare la query. Se gli altri disgiunti non sono indicizzati, la query si baserà su una scansione della raccolta.
  • $text non può essere utilizzato con i suggerimenti per le query.
  • Le query con ricerca di testo non possono essere ordinate per $natural.