In questo capitolo, presenteremo la ricerca full-text di MongoDB, che è diversa dall'operatore "like" di SQL. La ricerca full-text di MongoDB è più efficiente per la ricerca di testo rispetto all'implementazione di "like" in SQL.

Preparare i dati di test

Inserire alcuni record nella collezione degli store

db.stores.insert(
   [
     { _id: 1, name: "Java Hut", description: "Caffè e torte" },
     { _id: 2, name: "Burger Buns", description: "Hamburger gourmet" },
     { _id: 3, name: "Coffee Shop", description: "Solo caffè" },
     { _id: 4, name: "Clothes Clothes Clothes", description: "Abbigliamento in saldo" },
     { _id: 5, name: "Java Shopping", description: "Prodotti indonesiani" }
   ]
)

Creare l'indice di testo

Per utilizzare la capacità di ricerca full-text, è necessario creare un indice di testo. Esempio:

db.stores.createIndex( { name: "text", description: "text" } )

Spiegazione:

  • Creare un indice di tipo testo per i campi name e description.

Nota: Una collezione consente un solo indice di testo, ma un indice di testo può includere più campi.

Operatore $text

Usare l'operatore $text per la ricerca del testo.

Sintassi:

{ $text: { $search: "parola chiave di ricerca" } }

Esempio:

db.stores.find( { $text: { $search: "java coffee shop" } } )

Spiegazione:

  • Cerca documenti contenenti le parole chiave "caffè", "negozio" e "java" nei campi name e description.

Output:

{ "_id" : 3, "name" : "Coffee Shop", "description" : "Solo caffè" }
{ "_id" : 1, "name" : "Java Hut", "description" : "Caffè e torte" }
{ "_id" : 5, "name" : "Java Shopping", "description" : "Prodotti indonesiani" }

Ricerca di Frase

db.stores.find( { $text: { $search: "\"coffee shop\"" } } )

Output

{ "_id" : 3, "name" : "Coffee Shop", "description" : "Solo caffè" }

Ordinamento per Rilevanza

Per impostazione predefinita, i risultati di una query $text non sono ordinati. La query $text calcola un punteggio (textScore) per la rilevanza di ogni documento. Possiamo utilizzare questo punteggio per ordinare e visualizzare i documenti con maggiore rilevanza in cima.

db.stores.find(
   { $text: { $search: "java coffee shop" } },
   { score: { $meta: "textScore" } }  // Dichiarare di restituire il punteggio di rilevanza textScore
).sort( { score: { $meta: "textScore" } } ) // Specificare l'ordinamento utilizzando textScore

Nota: La ricerca full-text di MongoDB non fornisce un buon supporto per le frasi cinesi.