L'API Search fornisce un modello per l'indicizzazione dei documenti che contengono dati strutturati. Puoi eseguire ricerche in un indice, nonché organizzare e presentare i risultati di ricerca. L'API supporta la corrispondenza del testo completo nei campi di stringa. I documenti e gli indici vengono salvati in un archivio permanente distinto ottimizzato per le operazioni di ricerca. L'API Search può indicizzare un numero qualsiasi di documenti. App Engine Datastore potrebbe essere più appropriato per le applicazioni che devono recuperare set di risultati molto grandi.
Panoramica
L'API Search si basa su quattro concetti principali: documenti, indici, query e risultati.
Documenti
Un documento è un oggetto con un ID univoco e un elenco di campi contenenti i dati dell'utente. Ogni campo ha un nome e un tipo. Esistono diversi tipi di campi, identificati dai tipi di valori che contengono:
- Campo atomo: una stringa di caratteri indivisa.
- Campo di testo: una stringa di testo normale in cui è possibile eseguire ricerche parola per parola.
- Campo HTML: una stringa contenente tag di markup HTML. È possibile eseguire ricerche solo nel testo esterno ai tag di markup.
- Campo numerico: un numero con virgola mobile.
- Campo Data: un oggetto data.
- Campo punto geografico: un oggetto dati con coordinate di latitudine e longitudine.
La dimensione massima di un documento è 1 MB.
Indici
Un indice memorizza i documenti per il recupero. Puoi recuperare un singolo documento tramite il relativo ID, un intervallo di documenti con ID consecutivi o tutti i documenti di un indice. Puoi anche eseguire ricerche in un indice per recuperare i documenti che soddisfano determinati criteri per i campi e i relativi valori, specificati come stringa di query. Puoi gestire gruppi di documenti inserendoli in indici separati.
Non esiste un limite al numero di documenti in un indice o al numero di indici che puoi utilizzare. Per impostazione predefinita, la dimensione totale di tutti i documenti in un singolo indice è limitata a 10 GB. Gli utenti con il ruolo Amministratore App Engine possono inviare una richiesta dalla pagina App Engine Search della console Google Cloud per aumentare le dimensioni fino a 200 GB.
Query
Per eseguire una ricerca in un indice, devi creare una query, che contiene una stringa di query e possibilmente alcune opzioni aggiuntive. Una stringa di query specifica le condizioni per i valori di uno o più campi del documento. Quando esegui una ricerca in un indice, vengono restituiti solo i documenti dell'indice con i campi che soddisfano la query.
La query più semplice, a volte chiamata "ricerca globale", è una stringa che contiene solo valori di campo. Questa ricerca utilizza una stringa che cerca i documenti che contengono le parole "rosa" e "acqua":
Questa ricerca trova i documenti con campi data contenenti la data 4 luglio 1776 o campi di testo che includono la stringa "1776-07-04":
Una stringa di query può anche essere più specifica. Può contenere uno o più termini, ciascuno che nomina un campo e una limitazione del valore del campo. La forma esatta di un termine dipende dal tipo di campo. Ad esempio, supponendo che esista un campo di testo chiamato "prodotto" e un campo numerico chiamato "prezzo", di seguito è riportata una stringa di query con due termini:
Come suggerisce il nome, le opzioni di query non sono obbligatorie. Consentono di attivare una serie di funzionalità:
- Controlla il numero di documenti restituiti nei risultati di ricerca.
- Specifica i campi del documento da includere nei risultati. L'impostazione predefinita è includere tutti i campi del documento originale. Puoi specificare che i risultati includano solo un sottoinsieme di campi (il documento originale non è interessato).
- Ordina i risultati.
- Crea "campi calcolati" per i documenti utilizzando
FieldExpressions
e campi di testo abbreviati utilizzando snippet. - Supporta la visualizzazione dei risultati di ricerca tramite pagine restituendo solo una parte dei documenti corrispondenti per ogni query (utilizzando offset e cursori)
Ti consigliamo di registrare le stringhe di query nella tua applicazione se vuoi conservare un record delle query eseguite.
Risultati di ricerca
Una chiamata asearch()
può restituire solo un numero limitato di documenti corrispondenti.
La ricerca potrebbe trovare più documenti di quelli che possono essere restituiti in una singola chiamata. Ogni chiamata di ricerca restituisce un'istanza della classe
Results
, che contiene informazioni sul numero di documenti trovati e su quanti sono stati restituiti, nonché l'elenco dei documenti restituiti. Puoi ripetere la stessa ricerca utilizzando i cursori o gli offset per recuperare l'insieme completo di documenti corrispondenti.
Materiale di formazione aggiuntivo
Oltre a questa documentazione, puoi leggere il corso di formazione in due parti sull'API Search all'Academy per sviluppatori Google. Sebbene il corso utilizzi l'API Python, potresti trovare utile la discussione aggiuntiva dei concetti di ricerca.
Documenti e campi
La classe Document rappresenta i documenti. Ogni documento ha un identificatore del documento e un elenco di campi.Identificatore documento
Ogni documento in un indice deve avere un identificatore univoco, ovvero doc_id
.
L'identificatore può essere utilizzato per recuperare un documento da un indice senza eseguire una ricerca. Per impostazione predefinita, l'API Search genera automaticamente un doc_id
quando viene creato un documento. Puoi anche specificare il doc_id
autonomamente quando crei un documento. Un doc_id
deve contenere solo caratteri ASCII visibili e stampabili (codici ASCII da 33 a 126 inclusi) e non deve superare i 500 caratteri. Un identificatore di documento non può iniziare con un punto esclamativo ("!")
e non può iniziare e terminare con trattini bassi doppi ("__").
Sebbene sia pratico creare identificatori di documenti univoci leggibili e significativi,
non puoi includere doc_id
in una ricerca. Considera questo scenario: hai un indice con documenti che rappresentano componenti, utilizzando il numero di serie del componente come doc_id
. Sarà molto efficiente recuperare il documento per ogni singola parte, ma sarà impossibile cercare un intervallo di numeri di serie insieme ad altri valori di campo, come la data di acquisto. Il problema viene risolto memorizzando il numero di serie in un campo atom.
Campi documento
Un documento contiene campi con un nome, un tipo e un singolo valore di quel tipo. Due o più campi possono avere lo stesso nome, ma tipi diversi. Ad esempio, puoi definire due campi con il nome "età": uno con un tipo di testo (valore "ventidue") e l'altro con un tipo di numero (valore 22).
Nomi dei campi
I nomi dei campi sono sensibili alle maiuscole e possono contenere solo caratteri ASCII. Devono iniziare con una lettera e possono contenere lettere, cifre o trattini bassi. Il nome di un campo non può superare i 500 caratteri.
Campi con più valori
Un campo può contenere un solo valore, che deve corrispondere al tipo di campo. I nomi dei campi non devono essere univoci. Un documento può avere più campi con lo stesso nome e lo stesso tipo, che è un modo per rappresentare un campo con più valori. Tuttavia, i campi di date e numeri con lo stesso nome non possono essere ripetuti. Un documento può anche contenere più campi con lo stesso nome e tipi di campi diversi.
Tipi di campo
Esistono tre tipi di campi che memorizzano stringhe di caratteri java.lang.String
.
Collettivamente, li chiamiamo campi di stringhe:
- Campo di testo: una stringa con una lunghezza massima di 1024**2 caratteri.
- Campo HTML: una stringa formattata in HTML con una lunghezza massima di 1024**2 caratteri.
- Campo atomo: una stringa con una lunghezza massima di 500 caratteri.
Esistono anche tre tipi di campi che memorizzano dati non di testo:
- Campo numerico: un valore in virgola mobile a doppia precisione compreso tra -2.147.483.647 e 2.147.483.647.
- Campo Data: A
java.util.Date
. - Campo punto geografico: un punto sulla Terra descritto dalle coordinate di latitudine e longitudine.
I tipi di campo vengono specificati utilizzando gli enumerati
Field.FieldType
TEXT
, HTML
, ATOM
, NUMBER
, DATE
e GEO_POINT
.
Trattamento speciale dei campi di stringhe e date
Quando un documento con campi di testo, data o HTML viene aggiunto a un indice, viene eseguita una gestione speciale. Per utilizzare l'API Search in modo efficace, è utile comprendere cosa succede "sotto il cofano".
Tokenizzazione dei campi di stringa
Quando un campo HTML o di testo viene indicizzato, i relativi contenuti vengono tokenizzati. La stringa viene suddivisa in token ogni volta che vengono visualizzati spazi vuoti o caratteri speciali (segni di punteggiatura, segno di cancelletto, barra di sbarramento e così via). L'indice includerà una voce per ogni token. In questo modo puoi cercare parole chiave e frasi che includono solo una parte del valore di un campo. Ad esempio, una ricerca di "buio" corrisponderà a un documento con un campo di testo contenente la stringa "era una notte buia e tempestosa", mentre una ricerca di "ora" corrisponderà a un documento con un campo di testo contenente la stringa "questo è un sistema in tempo reale".
Nei campi HTML, il testo all'interno dei tag markup non viene tokenizzato, pertanto un documento con un
campo HTML contenente it was a <strong>dark</strong> night
corrisponderà a una
ricerca di "notte", ma non di "forte". Se vuoi poter cercare il testo con markup, memorizzalo in un campo di testo.
I campi di atomi non vengono tokenizzati. Un documento con un campo atomo con il valore "maltempo" corrisponderà solo a una ricerca dell'intera stringa "maltempo". Non corrisponderà a una ricerca di "cattivo" o "meteo" da solo.
Regole di tokenizzazione
I caratteri trattino basso (_) e e commerciale (&) non suddividono le parole in token.
Questi caratteri di spaziatura suddividono sempre le parole in token: spazio, ritorno a capo, avanzamento riga, tabulazione orizzontale, tabulazione verticale, a capo di modulo e NULL.
Questi caratteri vengono considerati come segni di punteggiatura e suddividono le parole in token:
! " % ( ) * , - | / [ ] ] ^ ` : = > ? @ { } ~ $ I caratteri nella tabella seguente in genere suddividono le parole in token, ma possono essere gestiti in modo diverso a seconda del contesto in cui appaiono:
Basato su caratteri Regola <
In un campo HTML, il segno "meno" indica l'inizio di un tag HTML che viene ignorato. +
Una stringa di uno o più segni "più" viene trattata come parte della parola se si trova alla fine della parola (C++). #
Il segno "hash" viene considerato parte della parola se è preceduto da a, b, c, d, e, f, g, j o x (a# - g# sono note musicali; j# e x# sono linguaggi di programmazione, c# è entrambi). Se un termine è preceduto da "#" (#google), viene considerato un hashtag e il cancelletto diventa parte della parola. '
L'apostrofo è una lettera se precede la lettera"s " seguita da un a capo, come in "Il cappello di Giovanni". .
Se tra le cifre è presente un punto decimale, questo fa parte di un numero (ovvero del separatore decimale). Può anche essere parte di una parola se utilizzata in un acronimo (A.B.C). -
Il trattino fa parte di una parola se utilizzato in un acronimo (I-B-M). Tutti gli altri caratteri a 7 bit diversi da lettere e cifre ("A-Z", "a-z", "0-9") vengono trattati come punteggiatura e suddividono le parole in token.
Tutto il resto viene analizzato come carattere UTF-8.
Acronimi
La tokenizzazione utilizza regole speciali per riconoscere gli acronimi (stringhe come "I.B.M.", "a-b-c" o "C I A"). Un acronimo è una stringa di singoli caratteri alfabetici, con lo stesso carattere di separazione tra tutti. I separatori validi sono il punto, il trattino o un numero qualsiasi di spazi. Il carattere separatore viene rimosso dalla stringa quando un acronimo viene tokenizzato. Pertanto, le stringhe di esempio menzionate sopra diventano i token "ibm", "abc" e "cia". Il testo originale rimane nel campo del documento.
Quando si tratta di acronimi, tieni presente che:
- Un acronimo non può contenere più di 21 lettere. Una stringa di acronimi valida con più di 21 lettere verrà suddivisa in una serie di acronimi, ciascuno con massimo 21 lettere.
- Se le lettere di un acronimo sono separate da spazi, tutte le lettere devono essere in maiuscolo. Gli acronimi costruiti con punto e trattino possono utilizzare lettere maiuscole e minuscole.
- Quando cerchi un acronimo, puoi inserire la forma canonica dell'acronimo (la stringa senza separatori) o l'acronimo con il trattino o il punto (ma non entrambi) tra le lettere. Pertanto, il testo "I.B.M" potrebbe essere recuperato con uno qualsiasi dei termini di ricerca "I-B-M", "I.B.M" o "IBM".
Precisione del campo Data
Quando crei un campo della data in un
documento, imposti il relativo valore su un java.util.Date
.
Ai fini dell'indicizzazione e della ricerca nel campo della data, qualsiasi componente temporale viene ignorato e la data viene convertita nel numero di giorni dal 1° gennaio 1970 UTC. Ciò significa che, anche se un campo della data può contenere un valore di ora preciso, una query sulla data può specificare solo un valore del campo della data nel formato yyyy-mm-dd
. Ciò significa anche che l'ordine ordinato dei campi della data con la stessa data non è ben definito.
Altre proprietà del documento
Il ranking di un documento è un numero intero positivo che determina l'ordinamento predefinito dei documenti restituiti da una ricerca. Per impostazione predefinita, il ranking viene impostato al momento della creazione del documento sul numero di secondi dal 1° gennaio 2011. Puoi impostare il ranking in modo esplicito quando crei un documento. Non è buona
idea assegnare lo stesso ranking a molti documenti e non dovresti mai assegnare lo stesso ranking a più
di 10.000 documenti.
Se specifichi sort
options,
puoi utilizzare il ranking come chiave di ordinamento. Tieni presente che quando il ranking viene utilizzato in un'espressione di ordinamento o in un'espressione di campo, viene fatto riferimento a _rank
.
La proprietà locale specifica la lingua in nella quale i campi sono codificati.
Per ulteriori dettagli su questi attributi, consulta la pagina di riferimento della classe
Document
.
Creazione di link da un documento ad altre risorse
Puoi utilizzare i campi doc_id
e altri di un documento come link ad altre risorse nella tua applicazione. Ad esempio, se utilizzi
Blobstore puoi associare
il documento a un blob specifico impostando doc_id
o il valore di un
campo Atom sul BlobKey dei dati.
Creazione di un documento
Per creare un documento, richiedi un nuovo generatore utilizzando il metodo
Document.newBuilder()
. Una volta che l'applicazione ha accesso a un generatore, può specificare un identificatore facoltativo del documento e aggiungere campi.
I campi, come i documenti, vengono creati utilizzando un generatore. Il metodo
Field.newBuilder()
restituisce un generatore di campi che consente di specificare il nome e il valore di un campo. Il tipo di campo viene specificato automaticamente scegliendo un metodo di impostazione specifico. Ad esempio, per indicare che un campo contiene testo normale, chiama
setText()
.
Il seguente codice crea un documento con campi che rappresentano un messaggio di benvenuto nel guestbook.
Per accedere ai campi all'interno del documento, utilizza getOnlyField()
:
Utilizzare un indice
Inserire i documenti in un indice
Quando inserisci un documento in un indice, il documento viene copiato nello spazio di archiviazione permanente e ciascuno dei suoi campi viene indicizzato in base al nome, al tipo e al valore doc_id
.
Il seguente esempio di codice mostra come accedere a un indice e inserire un documento al suo interno. I passaggi sono:
- Crea un
IndexSpec
- Crei una
SearchService
- Chiama
SearchService.getIndex()
per creare un'istanza di Index. - Chiama
Index.put()
per aggiungere il documento all'indice.
put()
. L'elaborazione collettiva è più efficiente rispetto all'aggiunta dei documenti uno alla volta.
Quando inserisci un documento in un indice che contiene già un documento con lo stesso doc_id
, il nuovo documento sostituisce quello precedente. Non viene fornito alcun avviso. Puoi chiamare
Index.get(id)
prima di creare o aggiungere un documento a un indice per verificare se esiste già un
doc_id
specifico.
Tieni presente che la creazione di un'istanza della classe Index
non garantisce l'effettiva esistenza di un indice permanente. Un indice permanente viene creato la prima volta che lo aggiungi un documento con il metodo put
.
Se vuoi verificare se un indice esistente prima di iniziare a utilizzarlo, utilizza il metodo SearchService.getIndexes()
.
Aggiornamento dei documenti
Un documento non può essere modificato dopo averlo aggiunto a un indice. Non puoi aggiungere o rimuovere campi né modificare il valore di un campo. Tuttavia, puoi sostituire il documento con un nuovo documento che abbia lo stesso doc_id
.
Recupero dei documenti per doc_id
Esistono due modi per recuperare i documenti da un indice utilizzando gli identificatori dei documenti:- Utilizza
Index.get()
per recuperare un singolo documento tramite il relativodoc_id
. - Utilizza
Index.getRange()
per recuperare un gruppo di documenti consecutivi ordinati perdoc_id
.
Ogni chiamata è illustrata nell'esempio riportato di seguito.
Ricerca dei documenti in base ai contenuti
Per recuperare i documenti da un indice, devi creare una stringa di query e chiamare
Index.search()
.
La stringa di query può essere passata direttamente come argomento oppure puoi includerla in un oggetto Query che viene passato come argomento.
Per impostazione predefinita, search()
restituisce i documenti corrispondenti ordinati in ordine decrescente di ranking. Per controllare il numero di documenti
restituito, il modo in cui vengono ordinati o aggiungere campi calcolati ai risultati, devi
utilizzare un oggetto Query
, che contiene una stringa di query e può anche specificare
altre opzioni di ricerca e ordinamento.
Eliminazione di un indice
Ogni indice è costituito dai documenti indicizzati e da uno schema di indice. Per eliminare un indice, elimina tutti i documenti in un indice, quindi elimina lo schema dell'indice.
Puoi eliminare i documenti in un indice specificando il doc_id
di uno o più documenti da eliminare nel metodo delete()
.
Per migliorare l'efficienza, ti consigliamo di eliminare i documenti in batch. Puoi passare fino a 200 ID documento alla volta al metodo delete()
.
delete()
. Eliminare più elementi contemporaneamente è più efficiente che gestirli uno alla volta.
Coerenza finale
Quando inserisci, aggiorni o elimini un documento in un indice, la modifica si propaga in più data center. In genere questa operazione avviene rapidamente, ma il tempo necessario può variare. L'API Search garantisce la coerenza finale. Ciò significa che in alcuni casi, una ricerca o il recupero di uno o più documenti potrebbe restituire risultati che non riflettono le modifiche più recenti.
Determinare le dimensioni di un indice
Un indice memorizza i documenti per il recupero. Puoi recuperare un singolo documento tramite il relativo ID, un intervallo di documenti con ID consecutivi o tutti i documenti di un indice. Puoi anche eseguire ricerche in un indice per recuperare i documenti che soddisfano determinati criteri per i campi e i relativi valori, specificati come stringa di query. Puoi gestire gruppi di documenti inserendoli in indici separati. Non esiste un limite al numero di documenti in un indice o al numero di indici che puoi utilizzare. Per impostazione predefinita, la dimensione totale di tutti i documenti in un singolo indice è limitata a 10 GB, ma può essere aumentata fino a 200 GB inviando una richiesta dalla pagina App Engine Search di Google Cloud Console. Il metodo
Index.getStorageLimit()
restituisce la dimensione massima consentita di un indice.
Index.getStorageUsage()
è una stima della quantità di spazio di archiviazione utilizzata da un indice. Questo numero è
una stima perché il sistema di monitoraggio dell'indice non viene eseguito continuamente;
l'utilizzo effettivo viene calcolato periodicamente. Il valore storage_usage
viene modificato tra i punti di campionamento tenendo conto delle aggiunte di documenti, ma non delle eliminazioni.
Schemi di indice
Ogni indice ha uno schema che mostra tutti i nomi e i tipi di campo che compaiono nei documenti che contiene. Non puoi definire uno schema autonomamente. Gli schemi vengono gestiti in modo dinamico e vengono aggiornati man mano che i documenti vengono aggiunti a un indice. Un semplice schema potrebbe avere il seguente aspetto, in formato JSON:
{'comment': ['TEXT'], 'date': ['DATE'], 'author': ['TEXT'], 'count': ['NUMBER']}
Ogni chiave del dizionario è il nome di un campo del documento. Il valore della chiave è un elenco dei tipi di campo utilizzati con il nome del campo. Se hai utilizzato lo stesso nome di campo con tipi di campo diversi, lo schema elenca più di un tipo di campo per un nome di campo, ad esempio:
{'ambiguous-integer': ['TEXT', 'NUMBER', 'ATOM']}
Una volta visualizzato in uno schema, un campo non può mai essere rimosso. Non è possibile eliminare un campo, anche se l'indice non contiene più documenti con quel determinato nome di campo.
Puoi visualizzare gli schemi per i tuoi indici come segue: Tieni presente che una chiamata aGetIndexes()
non può restituire più di 1000 indici. Per recuperare più indici, chiama il metodo più volte utilizzando setStartIndexName()
insieme a GetIndexesRequest.Builder
.
Uno schema non definisce una "classe" nel senso della programmazione ad oggetti. Per quanto riguarda l'API Search, ogni documento è univoco e gli indici possono contenere diversi tipi di documenti. Se vuoi trattare raccolte di oggetti con lo stesso elenco di campi come istanze di una classe, devi applicare un'astrazione nel codice. Ad esempio, puoi assicurarti che tutti i documenti con lo stesso insieme di campi vengano conservati nel proprio indice. Lo schema dell'indice può essere considerato come la definizione della classe e ogni documento nell'indice è un'istanza della classe.
Visualizzazione degli indici nella console Google Cloud
Nella console Google Cloud, puoi visualizzare informazioni sugli indici della tua applicazione e sui documenti che contengono. Se fai clic sul nome di un indice, vengono visualizzati i documenti che contiene. Vedrai tutti i campi dello schema definiti per l'indice. Per ogni documento con un campo con quel nome, vedrai il valore del campo. Puoi anche eseguire query sui dati dell'indice direttamente dalla console.
Quote dell'API Search
L'API Search ha diverse quote gratuite:
Risorsa o chiamata API | Quota gratuita |
---|---|
Capacità di archiviazione totale (documenti e indici) | 0,25 GB |
Query | 1000 query al giorno |
Aggiunta di documenti agli indici | 0,01 GB al giorno |
L'API Search impone questi limiti per garantire l'affidabilità del servizio. Si applicano sia alle app gratuite che a quelle a pagamento:
Risorsa | Quota di sicurezza |
---|---|
Utilizzo massimo delle query | 100 minuti aggregati di tempo di esecuzione delle query al minuto |
Numero massimo di documenti aggiunti o eliminati | 15.000 al minuto |
Dimensione massima per indice (numero illimitato di indici consentiti) | 10 GB |
L'utilizzo dell'API viene conteggiato in modi diversi a seconda del tipo di chiamata:
Index.search()
: ogni chiamata API viene conteggiata come una query; il tempo di esecuzione è equivalente alla latenza della chiamata.Index.put()
: quando aggiungi documenti agli indici, le dimensioni di ogni documento e il numero di documenti vengono conteggiati ai fini della quota di indicizzazione.- Tutte le altre chiamate all'API Search vengono conteggiate in base al numero di operazioni che comportano:
SearchService.getIndexes()
: viene conteggiata un'operazione per ogni indice effettivamente restituito o un'operazione se non viene restituito nulla.Index.get()
eIndex.getRange()
: 1 operazione conteggiata per ogni documento effettivamente restituito o 1 operazione se non viene restituito nulla.Index.delete()
: viene conteggiata un'operazione per ogni documento nella richiesta o un'operazione se la richiesta è vuota.
La quota sul throughput delle query viene impostata in modo che un singolo utente non possa monopolizzare il servizio di ricerca. Poiché le query possono essere eseguite contemporaneamente, ogni applicazione è autorizzata a eseguire query che consumano fino a 100 minuti di tempo di esecuzione per un minuto di tempo di sistema. Se esegui molte query brevi, probabilmente non raggiungerai questo limite. Una volta superata la quota, le query successive non andranno a buon fine fino al successivo intervallo di tempo, quando la quota verrà ripristinata. La quota non viene impostata rigorosamente in intervalli di un minuto; viene utilizzata una variante dell'algoritmo bucket con perdita per controllare la larghezza di banda di ricerca in incrementi di cinque secondi.
Puoi trovare ulteriori informazioni sulle quote nella pagina Quote. Quando un'app tenta di superare questi importi, viene visualizzato un errore di quota insufficiente.
Tieni presente che, sebbene questi limiti vengano applicati al minuto, la console mostra i totali giornalieri per ciascuno. I clienti con assistenza Silver, Gold o Platinum possono richiedere limiti di velocità effettiva più elevati contattando il rappresentante dell'assistenza.
Prezzi dell'API Search
I seguenti addebiti vengono applicati all'utilizzo oltre le quote gratuite:
Risorsa | Costo |
---|---|
Capacità di archiviazione totale (documenti e indici) | 0,18 $ per GB al mese |
Query | 0,50 $ per 10.000 query |
Indicizzazione dei documenti disponibili per la ricerca | 2,00 $ per GB |
Ulteriori informazioni sui prezzi sono disponibili nella pagina Prezzi.