Cercare ed eseguire query con indici di testo in Azure Cosmos DB per MongoDB vCore
SI APPLICA A: MongoDB vCore
Una delle funzionalità principali offerte da Azure Cosmos DB per MongoDB vCore è l'indicizzazione del testo, che consente una ricerca efficiente e l'esecuzione di query sui dati basati su testo. Il servizio implementa gli indici di testo versione 2. La versione 2 supporta la distinzione tra maiuscole e minuscole, ma non la distinzione diacritica.
Gli indici di testo in Azure Cosmos DB per MongoDB sono strutture di dati speciali che ottimizzano le query basate su testo, rendendole più veloci ed efficienti. Sono progettati per gestire contenuto testuale, ad esempio documenti, articoli, commenti o altri dati con una grande quantità di testo. Gli indici di testo usano tecniche come la tokenizzazione, lo stemming e parole vuote per creare un indice che migliora le prestazioni delle ricerche basate su testo.
Prerequisiti
- Un cluster Azure Cosmos DB for MongoDB vCore esistente.
- Se non si ha una sottoscrizione di Azure, creare un account gratuitamente.
- Se si ha già un abbonamento ad Azure, creare un nuovo cluster vCore di Azure Cosmos DB per MongoDB.
Definire un indice di testo
Per semplicità, consideriamo un esempio di applicazione blog con la configurazione seguente:
- Nome del database:
cosmicworks
- Nome della raccolta:
products
Questa applicazione di esempio archivia gli articoli come documenti con la struttura seguente:
{
"_id": ObjectId("617a34e7a867530bff1b2346"),
"title": "Azure Cosmos DB - A Game Changer",
"content": "Azure Cosmos DB is a globally distributed, multi-model database service.",
"author": "John Doe",
"category": "Technology",
"published": true
}
Utilizzare il metodo
createIndex
con l'opzionetext
per creare un indice di testo nel campotitle
.use cosmicworks; db.products.createIndex({ title: "text" })
Nota
Sebbene sia possibile definire un solo indice di testo per ogni raccolta, Azure Cosmos DB per MongoDB vCore consente di creare indici di testo in più campi per eseguire ricerche di testo in campi diversi nei documenti.
Si può creare un indice per supportare la ricerca nei campi
title
econtent
.db.products.createIndex({ title: "text", content: "text" })
Configurare le opzioni per l'indice di testo
Gli indici di testo in Azure Cosmos DB per MongoDB includono diverse opzioni per personalizzarne il comportamento. Ad esempio, è possibile specificare la lingua per l'analisi del testo, impostare la priorità di determinati campi e configurare le ricerche senza distinzione tra maiuscole e minuscole. Ecco un esempio di creazione di un indice di testo con opzioni:
Creare un indice per supportare la ricerca nei campi
title
econtent
con supporto per la lingua inglese. Assegnare inoltre un indici di priorità più elevata al campotitle
per dargli la priorità nei risultati della ricerca.db.products.createIndex( { title: "text", content: "text" }, { default_language: "english", weights: { title: 10, content: 5 }, caseSensitive: false } )
Priorità negli indici di testo
Quando si crea un indice di testo, è possibile assegnare priorità diverse ai singoli campi nell'indice. Queste priorità rappresentano l'importanza o la pertinenza di ogni campo nella ricerca. Azure Cosmos DB per MongoDB vCore calcola un punteggio e le priorità assegnate per ogni documento in base ai termini di ricerca durante l'esecuzione di una query di ricerca di testo. Il punteggio rappresenta la pertinenza del documento per la query di ricerca.
Creare un indice per supportare la ricerca nei campi
title
econtent
. Assegnare una priorità pari a 2 al campo "title" e una pari a 1 al campo "content".db.products.createIndex( { title: "text", content: "text" }, { weights: { title: 2, content: 1 } } )
Nota
Quando un utente esegue una query di ricerca di testo con il termine "Cosmos DB", il punteggio per ogni documento nella raccolta verrà calcolato in base alla presenza e alla frequenza del termine nei campi "title" e "content", con maggiore importanza assegnata al campo "title" a causa della priorità maggiore.
Eseguire una ricerca di testo usando un indice di testo
Dopo aver creato l'indice di testo, è possibile eseguire ricerche di testo usando l'operatore "text" nelle query. L'operatore text prende una stringa di ricerca e la confronta in base all'indice di testo per trovare i documenti pertinenti.
Eseguire una ricerca di testo per la frase
Cosmos DB
.db.products.find( { $text: { $search: "Cosmos DB" } } )
Si può usare l'operatore
$meta
di proiezione insieme altextScore
campo in una query per visualizzarne la prioritàdb.products.find( { $text: { $search: "Cosmos DB" } }, { score: { $meta: "textScore" } } )
Eliminazione di un indice di testo
Per eliminare un indice di testo in MongoDB, è possibile usare il metodo dropIndex()
nella raccolta e specificare la chiave o il nome dell'indice di testo da rimuovere.
Eliminare un indice di testo specificando in modo esplicito la chiave.
db.products.dropIndex({ title: "text" })
Si può eliminare un indice di testo specificando il nome univoco generato automaticamente.
db.products.dropIndex("title_text")
Limitazioni dell'indice di testo
- È possibile definire un solo indice di testo in una raccolta.
- Gli indici di testo supportano ricerche di testo semplici e non offrono funzionalità di ricerca avanzate come le ricerche di espressioni regolari.
- Hint() non è supportato in combinazione con una query che usa l’espressione $text.
- Le operazioni di riordinamento non possono usare l'ordine dell'indice di testo in MongoDB.
- Gli indici di testo possono essere relativamente grandi, occupando spazio di archiviazione significativo rispetto ad altri tipi di indice.