Utilizzare le ricerche 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 ricerche di testo:

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

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

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

Esegui il comando seguente per eseguire una ricerca di testo generale:

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

  # Aggregation search
  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 ricerca. Ad esempio, se hai una partizione city, puoi filtrare una ricerca di testo nel seguente modo:

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 partizione deve essere unito alla ricerca di testo utilizzando "and".

Impostare la lingua di ricerca di testo

Puoi impostare la lingua di ricerca di testo utilizzando l'argomento $language. Ad esempio:

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

Se non imposti una lingua, la ricerca utilizza la lingua dell'indice di testo.

Cercare un termine esatto

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

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

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

Cercare una combinazione di termini

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

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

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

Escludere un termine

Per escludere un termine da una ricerca di testo, anteponi al termine un trattino (-):

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

  # Aggregation search
  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 ricerca di testo. Per ordinare i risultati in ordine decrescente di 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 search
  db.cities
    .find({ $text: { $search: "best french bread" } })
    .sort({ SCORE_FIELD: { $meta: "textScore" } })

  # Aggregation search
  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 search
  db.cities
    .find({ $text: { $search: "best french bread" } })
    .project({ score: { $meta: "textScore" } })

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

Per migliorare la pertinenza dei risultati della ricerca di testo, l'operatore $text aumenta la stringa di ricerca in base alla lingua specificata per includere le 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 ricerca di testo.
  • È consentito un solo operatore $text per ricerca 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 gli indici ordinati esistenti per ottimizzare la ricerca. Se le altre disgiunzioni non sono indicizzate, la ricerca si basa su una scansione della raccolta.
  • $text non può essere utilizzato con gli hint.
  • Le query con ricerca di testo non possono essere ordinate in base a $natural.