Indicizzare i dati da Azure Cosmos DB for Apache Gremlin per le query in Azure AI Search
Importante
L'indicizzatore di Azure Cosmos DB for Apache Gremlin è attualmente disponibile in anteprima pubblica nel quadro delle Condizioni supplementari per l'utilizzo. Attualmente l'SDK non è supportato.
Questo articolo illustra come configurare un indicizzatore che importa contenuto da Azure Cosmos DB for Apache Gremlin e lo rende ricercabile in Azure AI Search.
Questo articolo integra Creare un indicizzatore con informazioni specifiche per Cosmos DB. Esso usa le API REST per illustrare un flusso di lavoro a tre passaggi comune a tutti gli indicizzatori: creare un'origine dati, creare un indice, creare un indicizzatore. L'estrazione di dati si verifica all’invio della richiesta Crea indicizzatore.
Poiché la terminologia può talvolta creare confusione, vale la pena notare che l'indicizzazione di Azure Cosmos DB e l'indicizzazione di Azure AI Search sono operazioni diverse. L'indicizzazione in Azure AI Search crea e carica un indice di ricerca nel servizio di ricerca.
Prerequisiti
Registrarsi per l'anteprima per fornire feedback sullo scenario. È possibile accedere automaticamente alla funzionalità dopo l'invio del modulo.
Un account, un database, un contenitore ed elementi di Azure Cosmos DB. Usare la stessa area per Azure AI Search e per Azure Cosmos DB per ridurre la latenza ed evitare addebiti per la larghezza di banda.
Un criterio di indicizzazione automatica nella raccolta di Azure Cosmos DB impostato su Coerente. Questa è la configurazione predefinita. L'indicizzazione differita non è consigliata e può comportare la mancanza di dati.
Autorizzazioni di lettura. Una stringa di connessione per l'accesso completo include una chiave che concede l'accesso al contenuto, ma se si usano i ruoli di Azure, assicurarsi che l'identità gestita del servizio di ricerca abbia le autorizzazioni del Ruolo Lettore dell'account Cosmos DB.
Un client REST per creare l'origine dati, l'indice e l'indicizzatore.
Definire l'origine dati
La definizione dell'origine dati specifica i dati da indicizzare e credenziali e criteri per identificare modifiche nei dati. Un’origine dati è definita come risorsa indipendente affinché possa essere usata da più indicizzatori.
Per questa chiamata, specificare una versione dell'API REST di anteprima per creare un'origine dati che si connette tramite Azure Cosmos DB for Apache Gremlin. È possibile usare 2021-04-01-preview o versione successiva. È consigliabile usare l'API di anteprima più recente.
Creare o aggiornare un'origine dati per impostarne la definizione:
POST https://[service name].search.windows.net/datasources?api-version=2024-05-01-preview Content-Type: application/json api-key: [Search service admin key] { "name": "[my-cosmosdb-gremlin-ds]", "type": "cosmosdb", "credentials": { "connectionString": "AccountEndpoint=https://[cosmos-account-name].documents.azure.com;AccountKey=[cosmos-account-key];Database=[cosmos-database-name];ApiKind=Gremlin;" }, "container": { "name": "[cosmos-db-collection]", "query": "g.V()" }, "dataChangeDetectionPolicy": { "@odata.type": "#Microsoft.Azure.Search.HighWaterMarkChangeDetectionPolicy", "highWaterMarkColumnName": "_ts" }, "dataDeletionDetectionPolicy": null, "encryptionKey": null, "identity": null } }
Impostare "type" su
"cosmosdb"
(obbligatorio).Impostare "credentials" su una stringa di connessione. Nella sezione successiva vengono descritti i formati supportati.
Impostare "container" sulla raccolta. La proprietà "name" è obbligatoria e specifica l'ID del grafo.
La proprietà "query" è facoltativa. Per impostazione predefinita, l'indicizzatore di Azure AI Search per Azure Cosmos DB for Apache Gremlin rende ogni vertice nel grafo un documento nell'indice. Gli archi verranno ignorati. Il valore predefinito della query è
g.V()
. In alternativa, è possibile impostare la query in modo da indicizzare solo gli archi. Per indicizzare gli archi, impostare la query sug.E()
.Impostare "dataChangeDetectionPolicy" se i dati sono volatili e si vuole che l'indicizzatore recuperi solo gli elementi nuovi e aggiornati nelle esecuzioni successive. L'avanzamento incrementale verrà abilitato per impostazione predefinita usando
_ts
come colonna del limite massimo.Impostare "dataDeletionDetectionPolicy" se si vogliono rimuovere i documenti di ricerca da un indice di ricerca quando l'elemento di origine viene eliminato.
Credenziali e stringhe di connessione supportate
Gli indicizzatori possono connettersi a una raccolta usando le connessioni seguenti. Per le connessioni destinate ad Azure Cosmos DB for Apache Gremlin, assicurarsi di includere "ApiKind" nella stringa di connessione.
Evitare di inserire numeri di porta nell'URL dell'endpoint. Se si include il numero di porta, la connessione avrà esito negativo.
Stringa di connessione per l'accesso completo |
---|
{ "connectionString" : "AccountEndpoint=https://<Cosmos DB account name>.documents.azure.com;AccountKey=<Cosmos DB auth key>;Database=<Cosmos DB database id>;ApiKind=MongoDb" } |
È possibile ottenere la stringa di connessione dalla pagina dell'account Azure Cosmos DB nel portale di Azure selezionando Chiavi nel riquadro di spostamento sinistro. Assicurarsi di selezionare una stringa di connessione completa e non soltanto una chiave. |
Stringa di connessione dell'identità gestita |
---|
{ "connectionString" : "ResourceId=/subscriptions/<your subscription ID>/resourceGroups/<your resource group name>/providers/Microsoft.DocumentDB/databaseAccounts/<your cosmos db account name>/;(ApiKind=[api-kind];)" } |
Questa stringa di connessione non richiede una chiave dell'account, ma è necessario aver precedentemente configurato un servizio di ricerca per la connessione tramite un'identità gestita e aver creato un'assegnazione di ruolo che concede le autorizzazioni del Ruolo Lettore dell'account Cosmos DB. Per altre informazioni, vedere Configurare una connessione dell'indicizzatore a un database di Azure Cosmos DB usando un'identità gestita. |
Aggiungere campi di ricerca a un indice
In un indice di ricerca aggiungere campi per accettare i documenti JSON di origine o l'output della proiezione di query personalizzata. Verificare che lo schema dell'indice di ricerca sia compatibile con il grafo. Per il contenuto in Azure Cosmos DB, lo schema dell'indice di ricerca deve corrispondere agli elementi di Azure Cosmos DB nell'origine dati.
Creare o aggiornare un indice per definire i campi di ricerca che archivieranno i dati:
POST https://[service name].search.windows.net/indexes?api-version=2024-05-01-preview Content-Type: application/json api-key: [Search service admin key] { "name": "mysearchindex", "fields": [ { "name": "rid", "type": "Edm.String", "facetable": false, "filterable": false, "key": true, "retrievable": true, "searchable": true, "sortable": false, "analyzer": "standard.lucene", "indexAnalyzer": null, "searchAnalyzer": null, "synonymMaps": [], "fields": [] },{ }, { "name": "label", "type": "Edm.String", "searchable": true, "filterable": false, "retrievable": true, "sortable": false, "facetable": false, "key": false, "indexAnalyzer": null, "searchAnalyzer": null, "analyzer": "standard.lucene", "synonymMaps": [] }] }
Creare un campo chiave documento ("chiave": true). Per le raccolte partizionate, la chiave di documento predefinita è la proprietà
_rid
di Azure Cosmos DB, che Azure AI Search rinomina automaticamente comerid
perché i nomi di campo non possono iniziare con un carattere di sottolineatura. Inoltre, i valori_rid
di Azure Cosmos DB contengono caratteri non validi per chiavi di Azure AI Search. Per questo motivo, i valori_rid
presentano la codificata Base64.Creare campi aggiuntivi per rendere il contenuto più ricercabile. Per altri dettagli, vedere Creare un indice.
Mapping di tipi di dati
Tipo di dati JSON | Tipi di campo di Azure AI Search |
---|---|
Bool | Edm.Boolean, Edm.String |
Numeri che rappresentano numeri interi | Edm.Int32, Edm.Int64, Edm.String |
Numeri che rappresentano numeri a virgola mobile | Edm.Double, Edm.String |
String | Edm.String |
Matrici di tipi primitivi, ad esempio ["a", "b", "c"] | Collection(Edm.String) |
Stringhe che rappresentano date | Edm.DateTimeOffset, Edm.String |
Oggetti GeoJSON, ad esempio { "type": "Point", "coordinates": [long, lat] } | Edm.GeographyPoint |
Altri oggetti JSON | N/D |
Configurare ed eseguire l'indicizzatore di Azure Cosmos DB
Dopo aver creato l'indice e l'origine dati, è possibile creare l'indicizzatore. La configurazione dell'indicizzatore specifica gli input, i parametri e le proprietà che controllano i comportamenti della fase di esecuzione.
Creare o aggiornare l'indicizzatore assegnandogli un nome e il riferimento all’origine dati e all'indice di destinazione:
POST https://[service name].search.windows.net/indexers?api-version=2024-05-01-preview Content-Type: application/json api-key: [search service admin key] { "name" : "[my-cosmosdb-indexer]", "dataSourceName" : "[my-cosmosdb-gremlin-ds]", "targetIndexName" : "[my-search-index]", "disabled": null, "schedule": null, "parameters": { "batchSize": null, "maxFailedItems": 0, "maxFailedItemsPerBatch": 0, "base64EncodeKeys": false, "configuration": {} }, "fieldMappings": [], "encryptionKey": null }
Specificare i mapping dei campi se sono presenti differenze nel nome o nel tipo di campo oppure se sono necessarie più versioni di un campo di origine nell'indice di ricerca.
Per ulteriori informazioni su altre proprietà, vedere Creare un indicizzatore.
Un indicizzatore viene eseguito automaticamente al momento della sua creazione. È possibile ovviare a questo problema impostando "disabilitato" su true. Per controllare l'esecuzione dell'indicizzatore, eseguire un indicizzatore su richiesta o inserirlo in una pianificazione.
Controllare lo stato dell'indicizzatore
Per monitorare lo stato dell'indicizzatore e la cronologia di esecuzione, inviare una richiesta Ottieni stato dell’indicizzatore:
GET https://myservice.search.windows.net/indexers/myindexer/status?api-version=2024-05-01-preview
Content-Type: application/json
api-key: [admin key]
La risposta include lo stato e il numero di elementi elaborati. Dovrebbe risultare simile all'esempio seguente:
{
"status":"running",
"lastResult": {
"status":"success",
"errorMessage":null,
"startTime":"2022-02-21T00:23:24.957Z",
"endTime":"2022-02-21T00:36:47.752Z",
"errors":[],
"itemsProcessed":1599501,
"itemsFailed":0,
"initialTrackingState":null,
"finalTrackingState":null
},
"executionHistory":
[
{
"status":"success",
"errorMessage":null,
"startTime":"2022-02-21T00:23:24.957Z",
"endTime":"2022-02-21T00:36:47.752Z",
"errors":[],
"itemsProcessed":1599501,
"itemsFailed":0,
"initialTrackingState":null,
"finalTrackingState":null
},
... earlier history items
]
}
La cronologia di esecuzione contiene fino a 50 esecuzioni completate più recenti in ordine cronologico inverso, in modo che l'esecuzione più recente venga visualizzata per prima.
Indicizzazione di documenti nuovi e modificati
Dopo che un indicizzatore ha popolato completamente un indice di ricerca, può essere utile che le esecuzioni successive indicizzino in modo incrementale solo i documenti nuovi e modificati nel database.
Per abilitare l'indicizzazione incrementale, impostare la proprietà "dataChangeDetectionPolicy" nella definizione dell'origine dati. Questa proprietà indica all'indicizzatore quale meccanismo di rilevamento delle modifiche viene usato sui dati.
Per gli indicizzatori di Azure Cosmos DB, l'unico criterio supportato è HighWaterMarkChangeDetectionPolicy
che usa la proprietà _ts
(timestamp) fornita da Azure Cosmos DB.
L'esempio seguente mostra una definizione dell'origine dati con un criterio di rilevamento delle modifiche:
"dataChangeDetectionPolicy": {
"@odata.type": "#Microsoft.Azure.Search.HighWaterMarkChangeDetectionPolicy",
" highWaterMarkColumnName": "_ts"
},
Indicizzazione di documenti eliminati
Quando i dati del grafo vengono eliminati, è possibile eliminare dall'indice di ricerca anche il documento corrispondente. Lo scopo di un criterio di rilevamento dell'eliminazione dei dati è quello di identificare in modo efficace gli elementi di dati eliminati ed eliminare l'intero documento dall'indice. Il criterio di rilevamento dell'eliminazione dei dati non è progettato per eliminare informazioni parziali del documento. Attualmente, l'unico criterio supportato è il criterio Soft Delete
(l'eliminazione è contrassegnata da un tipo di flag), specificato nella definizione dell'origine dati come segue:
"dataDeletionDetectionPolicy"": {
"@odata.type" : "#Microsoft.Azure.Search.SoftDeleteColumnDeletionDetectionPolicy",
"softDeleteColumnName" : "the property that specifies whether a document was deleted",
"softDeleteMarkerValue" : "the value that identifies a document as deleted"
}
L'esempio seguente crea un'origine dati con criteri di eliminazione temporanea:
POST https://[service name].search.windows.net/datasources?api-version=2024-05-01-preview
Content-Type: application/json
api-key: [Search service admin key]
{
"name": "[my-cosmosdb-gremlin-ds]",
"type": "cosmosdb",
"credentials": {
"connectionString": "AccountEndpoint=https://[cosmos-account-name].documents.azure.com;AccountKey=[cosmos-account-key];Database=[cosmos-database-name];ApiKind=Gremlin"
},
"container": { "name": "[my-cosmos-collection]" },
"dataChangeDetectionPolicy": {
"@odata.type": "#Microsoft.Azure.Search.HighWaterMarkChangeDetectionPolicy",
"highWaterMarkColumnName": "`_ts`"
},
"dataDeletionDetectionPolicy": {
"@odata.type": "#Microsoft.Azure.Search.SoftDeleteColumnDeletionDetectionPolicy",
"softDeleteColumnName": "isDeleted",
"softDeleteMarkerValue": "true"
}
}
Anche se si abilita il criterio di rilevamento dell'eliminazione, l'eliminazione di campi complessi (Edm.ComplexType
) dall'indice non è supportata. Questo criterio richiede che la colonna 'active' nel database Gremlin sia di tipo Integer, stringa o booleano.
Mapping dei dati del grafo ai campi in un indice di ricerca
L'indicizzatore di Azure Cosmos DB for Apache Gremlin eseguirà automaticamente il mapping di alcune parti di dati del grafo:
L'indicizzatore eseguirà il mapping di
_rid
a un camporid
nell'indice, se esistente, e ne eseguirà la codifica Base64.L'indicizzatore eseguirà il mapping di
_id
a un campoid
nell'indice, se esistente.Quando si eseguono query sul database di Azure Cosmos DB usando Azure Cosmos DB for Apache Gremlin, è possibile notare che l'output JSON per ogni proprietà ha un
id
e unvalue
. L'indicizzatore eseguirà automaticamente il mapping delle proprietàvalue
in un campo nell'indice di ricerca con lo stesso nome della proprietà, se esistente. Nell'esempio seguente viene eseguito il mapping di 450 a un campopages
nell'indice di ricerca.
{
"id": "Cookbook",
"label": "book",
"type": "vertex",
"properties": {
"pages": [
{
"id": "48cf6285-a145-42c8-a0aa-d39079277b71",
"value": "450"
}
]
}
}
Potrebbe essere necessario usare mapping dei campi di output per eseguire il mapping dell'output della query ai campi nell'indice. Probabilmente si vorranno usare mapping dei campi di output anziché mapping dei campi poiché la query personalizzata avrà probabilmente dati complessi.
Si supponga, ad esempio, che la query produca questo output:
[
{
"vertex": {
"id": "Cookbook",
"label": "book",
"type": "vertex",
"properties": {
"pages": [
{
"id": "48cf6085-a211-42d8-a8ea-d38642987a71",
"value": "450"
}
],
}
},
"written_by": [
{
"yearStarted": "2017"
}
]
}
]
Se si vuole eseguire il mapping del valore di pages
nel codice JSON precedente a un campo totalpages
nell'indice, è possibile aggiungere il mapping dei campi di output alla definizione dell'indicizzatore:
... // rest of indexer definition
"outputFieldMappings": [
{
"sourceFieldName": "/document/vertex/pages",
"targetFieldName": "totalpages"
}
]
Si noti che il mapping dei campi di output inizia con /document
e non include un riferimento alla chiave delle proprietà nel codice JSON. Questo perché l'indicizzatore inserisce ogni documento nel nodo /document
al momento dell'inserimento dei dati del grafo. L'indicizzatore consente inoltre di fare riferimento automaticamente al valore di pages
con un riferimento semplice a pages
, senza bisogno di fare riferimento al primo oggetto nella matrice di pages
.
Passaggi successivi
Per altre informazioni su Azure Cosmos DB for Apache Gremlin, vedere Introduzione ad Azure Cosmos DB: Azure Cosmos DB for Apache Gremlin.
Per altre informazioni sugli scenari e sui prezzi di Azure AI Search, vedere la pagina del servizio di ricerca su azure.microsoft.com.
Per informazioni sulla configurazione della rete per gli indicizzatori, vedere Accesso dell'indicizzatore al contenuto protetto dalle funzionalità di sicurezza di rete di Azure.