Esecuzione di ricerche di testo con Amazon DocumentDB - Amazon DocumentDB

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Esecuzione di ricerche di testo con Amazon DocumentDB

La funzionalità di ricerca full text nativa di Amazon DocumentDB consente di eseguire ricerche di testo su set di dati testuali di grandi dimensioni utilizzando indici di testo per scopi speciali. Questa sezione descrive le funzionalità della funzione di indice di testo e fornisce passaggi su come creare e utilizzare indici di testo in Amazon DocumentDB. Sono inoltre elencate le limitazioni della ricerca testuale.

Funzionalità supportate

La ricerca testuale di Amazon DocumentDB supporta le seguenti funzionalità compatibili con MongoDB: API

  • Crea indici di testo su un singolo campo.

  • Crea indici di testo composti che includono più di un campo di testo.

  • Esegui ricerche di una o più parole.

  • Controlla i risultati della ricerca utilizzando i pesi.

  • Ordina i risultati della ricerca per punteggio.

  • Usa l'indice di testo nella pipeline di aggregazione.

  • Cerca la frase esatta.

Per creare un indice di testo su un campo contenente dati di tipo stringa, specifica la stringa «testo» come illustrato di seguito:

Indice a campo singolo:

db.test.createIndex({"comments": "text"})

Questo indice supporta le query di ricerca testuale nel campo stringa «commenti» della raccolta specificata.

Crea un indice di testo composto su più di un campo stringa:

db.test.createIndex({"comments": "text", "title":"text"})

Questo indice supporta le query di ricerca testuale nei campi di stringhe «comments» e «title» della raccolta specificata. È possibile specificare fino a 30 campi durante la creazione di un indice di testo composto. Una volta create, le query di ricerca testuale interrogheranno tutti i campi indicizzati.

Nota

È consentito un solo indice di testo per ogni raccolta.

Elencare un indice di testo in una raccolta Amazon DocumentDB

Puoi utilizzarlo getIndexes() nella tua collezione per identificare e descrivere gli indici, inclusi gli indici di testo, come mostrato nell'esempio seguente:

rs0:PRIMARY> db.test.getIndexes() [ { "v" : 4, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "test.test" }, { "v" : 1, "key" : { "_fts" : "text", "_ftsx" : 1 }, "name" : "contents_text", "ns" : "test.test", "default_language" : "english", "weights" : { "comments" : 1 }, "textIndexVersion" : 1 } ]

Dopo aver creato un indice, inizia a inserire dati nella tua raccolta Amazon DocumentDB.

db.test.insertMany([{"_id": 1, "star_rating": 4, "comments": "apple is red"}, {"_id": 2, "star_rating": 5, "comments": "pie is delicious"}, {"_id": 3, "star_rating": 3, "comments": "apples, oranges - healthy fruit"}, {"_id": 4, "star_rating": 2, "comments": "bake the apple pie in the oven"}, {"_id": 5, "star_rating": 5, "comments": "interesting couch"}, {"_id": 6, "star_rating": 5, "comments": "interested in couch for sale, year 2022"}])

Esecuzione di query di ricerca testuale

Esegui una query di ricerca testuale composta da una sola parola

Dovrai utilizzare gli $search operatori $text e per eseguire ricerche di testo. L'esempio seguente restituisce tutti i documenti in cui il campo indicizzato di testo contiene la stringa «apple» o «apple» in altri formati come «apples»:

db.test.find({$text: {$search: "apple"}})

Output:

L'output di questo comando è simile al seguente:

{ "_id" : 1, "star_rating" : 4, "comments" : "apple is red" } { "_id" : 3, "star_rating" : 3, "comments" : "apples, oranges - healthy fruit" } { "_id" : 4, "star_rating" : 2, "comments" : "bake the apple pie in the oven" }

Esegui una ricerca testuale composta da più parole

Puoi anche eseguire ricerche di testo di più parole sui dati di Amazon DocumentDB. Il comando seguente restituisce documenti con un campo di testo indicizzato contenente «apple» o «pie»:

db.test.find({$text: {$search: "apple pie"}})

Output:

L'output di questo comando è simile al seguente:

{ "_id" : 1, "star_rating" : 4, "comments" : "apple is red" } { "_id" : 2, "star_rating" : 5, "comments" : "pie is delicious" } { "_id" : 3, "star_rating" : 3, "comments" : "apples, oranges - healthy fruit" } { "_id" : 4, "star_rating" : 2, "comments" : "bake the apple pie in the oven" }

Esegui una ricerca testuale composta da più frasi

Per una ricerca di frasi composta da più parole, usa questo esempio:

db.test.find({$text: {$search: "\"apple pie\""}})

Output:

Il comando precedente restituisce documenti con un campo di testo indicizzato contenente la frase esatta «torta di mele». L'output di questo comando è simile al seguente:

{ "_id" : 4, "star_rating" : 2, "comments" : "bake the apple pie in the oven" }

Esegui una ricerca testuale con filtri

Puoi anche combinare la ricerca testuale con altri operatori di query per filtrare i risultati in base a criteri aggiuntivi:

db.test.find({$and: [{star_rating: 5}, {$text: {$search: "interest"}}]})

Output:

Il comando precedente restituisce documenti con un campo di testo indicizzato contenente qualsiasi forma di «interesse» e un «star_rating» pari a 5. L'output di questo comando è simile al seguente:

{ "_id" : 5, "star_rating" : 5, "comments" : "interesting couch" } { "_id" : 6, "star_rating" : 5, "comments" : "interested in couch for sale, year 2022" }

Limita il numero di documenti restituiti in una ricerca testuale

Puoi scegliere di limitare il numero di documenti restituiti utilizzandolimit:

db.test.find({$and: [{star_rating: 5}, {$text: {$search: "couch"}}]}).limit(1)

Output:

Il comando precedente restituisce un risultato che soddisfa il filtro:

{ "_id" : 5, "star_rating" : 5, "comments" : "interesting couch" }

Ordina i risultati per punteggio di testo

L'esempio seguente ordina i risultati della ricerca testuale per punteggio di testo:

db.test.find({$text: {$search: "apple"}}, {score: {$meta: "textScore"}}).sort({score: {$meta: "textScore"}})

Output:

Il comando precedente restituisce documenti con un campo di testo indicizzato contenente «apple» o «apple» negli altri formati come «apples», e ordina il risultato in base alla pertinenza del documento rispetto al termine di ricerca. L'output di questo comando è simile al seguente:

{ "_id" : 1, "star_rating" : 4, "comments" : "apple is red", "score" : 0.6079270860936958 } { "_id" : 3, "star_rating" : 3, "comments" : "apples, oranges - healthy fruit", "score" : 0.6079270860936958 } { "_id" : 4, "star_rating" : 2, "comments" : "bake the apple pie in the oven", "score" : 0.6079270860936958 }

$texte $search sono supportati anche per aggregatecount, findAndModifyupdate, e delete comandi.

Operatori di aggregazione

Pipeline di aggregazione utilizzando $match

db.test.aggregate( [{ $match: { $text: { $search: "apple pie" } } }] )

Output:

Il comando precedente restituisce i seguenti risultati:

{ "_id" : 1, "star_rating" : 4, "comments" : "apple is red" } { "_id" : 3, "star_rating" : 3, "comments" : "apple - a healthy fruit" } { "_id" : 4, "star_rating" : 2, "comments" : "bake the apple pie in the oven" } { "_id" : 2, "star_rating" : 5, "comments" : "pie is delicious" }

Una combinazione di altri operatori di aggregazione

db.test.aggregate( [ { $match: { $text: { $search: "apple pie" } } }, { $sort: { score: { $meta: "textScore" } } }, { $project: { score: { $meta: "textScore" } } } ] )

Output:

Il comando precedente restituisce i seguenti risultati:

{ "_id" : 4, "score" : 0.6079270860936958 } { "_id" : 1, "score" : 0.3039635430468479 } { "_id" : 2, "score" : 0.3039635430468479 } { "_id" : 3, "score" : 0.3039635430468479 }

Specificate più campi durante la creazione di un indice di testo

Puoi assegnare pesi a un massimo di tre campi nell'indice di testo composto. Il peso predefinito assegnato a un campo in un indice di testo è uno (1). Il peso è un parametro opzionale e deve essere compreso tra 1 e 100000.

db.test.createIndex( { "firstname": "text", "lastname": "text", ... }, { weights: { "firstname": 5, "lastname":10, ... }, name: "name_text_index" } )

Differenze con MongoDB

La funzionalità di indice di testo di Amazon DocumentDB utilizza un indice invertito con un algoritmo di frequenza dei termini. Per impostazione predefinita, gli indici di testo sono sparsi. A causa delle differenze nella logica di analisi, nei delimitatori di tokenizzazione e in altri modi, lo stesso set di risultati di MongoDB potrebbe non essere restituito per lo stesso set di dati o la stessa forma di query.

Esistono le seguenti differenze aggiuntive tra l'indice di testo di Amazon DocumentDB e MongoDB:

  • Gli indici composti che utilizzano indici non testuali non sono supportati.

  • Gli indici di testo di Amazon DocumentDB non fanno distinzione tra maiuscole e minuscole e i segni diacritici.

  • L'indice di testo supporta solo la lingua inglese.

  • L'indicizzazione del testo dei campi array (o a più chiavi) non è supportata. Ad esempio, la creazione di un indice di testo su «a» con il documento {«a»: [«apple», «pie»]} avrà esito negativo.

  • L'indicizzazione del testo con caratteri jolly non è supportata.

  • Gli indici di testo univoci non sono supportati.

  • L'esclusione di un termine non è supportata.

Migliori pratiche e linee guida

  • Per prestazioni ottimali nelle query di ricerca di testo che prevedono l'ordinamento in base a punteggi di testo, si consiglia di creare l'indice di testo prima di caricare i dati.

  • Gli indici di testo richiedono spazio di archiviazione aggiuntivo per una copia interna ottimizzata dei dati indicizzati. Ciò ha implicazioni aggiuntive in termini di costi.

Limitazioni

La ricerca di testo presenta le seguenti limitazioni in Amazon DocumentDB:

  • La ricerca di testo è supportata solo nei cluster basati su istanze di Amazon DocumentDB 5.0.