Utilizza le funzionalità di ricerca testuale in Cloud Firestore per cercare stringhe specifiche all'interno di una raccolta.
Prima di iniziare
Prima di iniziare a utilizzare le ricerche testuali:
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.
Eseguire una ricerca testuale
Le ricerche testuali utilizzano l'operatore $text all'interno di un filtro.
Specifica la stringa sottoposta a query nell'argomento $search.
Eseguire una ricerca testuale generale
Esegui il comando seguente per eseguire una ricerca testuale 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 testuale 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 testuale utilizzando "and".
Impostare la lingua di ricerca testuale
Puoi impostare la lingua di ricerca testuale 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 testuale, 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 testuale, anteponi un trattino (-) al termine:
# 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 testuale. 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"} } },
]);
Espandere la ricerca
Per migliorare la pertinenza dei risultati della ricerca testuale, 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, variazioni diacritiche e altro ancora.
Limitazioni
- Gli operatori
$neare$textnon possono essere utilizzati nella stessa ricerca testuale. - È consentito un solo operatore
$textper ricercafindoaggregation. - 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 ricerca. Se le altre disgiunzioni non sono indicizzate, la ricerca si basa su una scansione della raccolta. $textnon può essere utilizzato con gli hint.- Le query con ricerca testuale non possono essere ordinate in base a
$natural.