Utilizza le funzionalità di ricerca di testo in Cloud Firestore per cercare stringhe specifiche all'interno di una raccolta.
Prima di iniziare
Prima di iniziare a utilizzare le query di testo:
Assicurati di avere accesso a un database di operazioni compatibile con MongoDB esistente o crea un database e connettiti.
Assicurati di avere un indice di testo o crea un indice di testo.
Autorizzazioni IAM
Per creare un indice in Cloud Firestore, assicurati di avere uno dei seguenti ruoli:
roles/datastore.ownerroles/datastore.indexAdminroles/editorroles/owner
Per concedere un ruolo, consulta Concedi un singolo ruolo. Per ulteriori informazioni sui ruoli Cloud Firestore e sulle autorizzazioni associate, consulta Ruoli predefiniti.
Se hai definito ruoli personalizzati, assegna tutte le seguenti autorizzazioni per creare gli indici:
datastore.indexes.createdatastore.indexes.deletedatastore.indexes.getdatastore.indexes.listdatastore.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 generale
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 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 query utilizzando "and".
Impostare la lingua di query
Puoi impostare la lingua di query utilizzando l'argomento $language. Ad esempio:
db.cities.find({ $text: { $search: "french bread", $language: "en"} })
Se non imposti la lingua di query, la query utilizza la lingua dell'indice di testo.
Eseguire una query su 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 la query più precisa, 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 al termine un trattino (-):
# 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 che corrispondono alla query 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 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 le corrispondenze per sinonimi sensibili al contesto, forme derivate, termini con correzione ortografica, varianti diacritiche e altro ancora.
Limitazioni
- Gli operatori
$neare$textnon possono essere utilizzati nella stessa query. - È consentito un solo operatore
$textper queryfindoaggregation. - Nelle aggregazioni, la fase
$matchcon$textdeve essere la prima fase della pipeline. $textpuò essere nidificato solo all'interno di$ande$or.- Se
$textsi trova all'interno di$or, le disgiunzioni non di ricerca possono utilizzare gli indici ordinati esistenti per ottimizzare la query. Se le altre disgiunzioni non sono indicizzate, la query si baserà su una scansione della raccolta. $textnon può essere utilizzato con gli hint di query.- Le query con ricerca di testo non possono essere ordinate in base a
$natural.