Connessione del database SQL di Azure a Ricerca di Azure tramite gli indicizzatoriConnecting Azure SQL Database to Azure Search using indexers

Prima di poter eseguire una query nell'indice di Ricerca di Azure, è necessario inserirvi i propri dati.Before you can query an Azure Search index, you must populate it with your data. Se i dati si trovano in un database SQL di Azure, l'Indicizzatore di Ricerca di Azure per il database SQL di Azure, o in breve Indicizzatore SQL di Azure, è in grado di automatizzare il processo di indicizzazione. Questo implica che la quantità di codice da scrivere è inferiore, così come l'infrastruttura di cui occuparsi.If the data lives in an Azure SQL database, an Azure Search indexer for Azure SQL Database (or Azure SQL indexer for short) can automate the indexing process, which means less code to write and less infrastructure to care about.

In questo articolo vengono illustrati i meccanismi di uso degli indicizzatori, ma vengono anche descritte le funzionalità disponibili solo con i database SQL, ad esempio, il rilevamento delle modifiche integrato.This article covers the mechanics of using indexers, but also describes features only available with Azure SQL databases (for example, integrated change tracking).

Oltre ai database SQL di Azure, Ricerca di Azure offre indicizzatori per Azure Cosmos DB, Archivio BLOB di Azure e Archiviazione tabelle di Azure.In addition to Azure SQL databases, Azure Search provides indexers for Azure Cosmos DB, Azure Blob storage, and Azure table storage. Per richiedere il supporto per altre origini dati, inviare commenti e suggerimenti nel forum relativo a commenti e suggerimenti di Ricerca di Azure.To request support for other data sources, provide your feedback on the Azure Search feedback forum.

Indicizzatori e origini datiIndexers and data sources

Un'origine dati specifica i dati da indicizzare, le credenziali necessarie per accedere ai dati e i criteri che consentono di identificare in modo efficace le modifiche apportate ai dati, ovvero righe nuove, modificate o eliminate.A data source specifies which data to index, credentials for data access, and policies that efficiently identify changes in the data (new, modified, or deleted rows). È definita come risorsa indipendente affinché possa essere usata da più indicizzatori.It's defined as an independent resource so that it can be used by multiple indexers.

Un indicizzatore è una risorsa che connette una singola origine dati agli indici di ricerca di destinazione.An indexer is a resource that connects a single data source with a targeted search index. Un indicizzatore viene usato nei modi seguenti:An indexer is used in the following ways:

  • Eseguire una copia occasionale dei dati per popolare un indice.Perform a one-time copy of the data to populate an index.
  • Aggiornare un indice con le modifiche nell'origine dati in base a una pianificazione.Update an index with changes in the data source on a schedule.
  • Eseguire aggiornamenti su richiesta in un indice in base alle esigenze.Run on-demand to update an index as needed.

Un singolo indicizzatore può usare solo una tabella o una vista, ma è possibile creare più indicizzatori se si desidera compilare indici di ricerca multipli.A single indexer can only consume one table or view, but you can create multiple indexers if you want to populate multiple search indexes. Per altre informazioni sui concetti, vedere Operazioni degli indicizzatori: flusso di lavoro tipico.For more information on concepts, see Indexer Operations: Typical workflow.

È possibile impostare e configurare un indicizzatore SQL di Azure usando:You can set up and configure an Azure SQL indexer using:

In questo articolo si userà l'API REST per creare gli indicizzatori e le origini dati.In this article, we'll use the REST API to create indexers and data sources.

Quando usare l’indicizzatore SQL di AzureWhen to use Azure SQL Indexer

In base a diversi fattori relativi ai dati, l'utilizzo dell'indicizzatore di SQL di Azure potrebbe non essere appropriato.Depending on several factors relating to your data, the use of Azure SQL indexer may or may not be appropriate. Se i dati soddisfano i requisiti seguenti, è possibile usare l’indicizzatore SQL di Azure.If your data fits the following requirements, you can use Azure SQL indexer.

CriteriCriteria DettagliDetails
I dati provengono da una singola tabella o vistaData originates from a single table or view Se i dati sono sparsi tra più tabelle, è possibile creare un'unica vista dei dati.If the data is scattered across multiple tables, you can create a single view of the data. Tuttavia, se si usa una vista, non sarà possibile usare il rilevamento delle modifiche integrato di SQL Server per aggiornare un indice con le modifiche incrementali.However, if you use a view, you won’t be able to use SQL Server integrated change detection to refresh an index with incremental changes. Per altre informazioni, vedere Acquisizione delle righe modificate ed eliminate di seguito.For more information, see Capturing Changed and Deleted Rows below.
Tipi di dati compatibiliData types are compatible Nell'indice di Ricerca di Azure è supportata la maggior parte dei tipi SQL, ma non tutti.Most but not all the SQL types are supported in an Azure Search index. Per un elenco, vedere Elenco dei tipi di dati.For a list, see Mapping data types.
La sincronizzazione dei dati in tempo reale non è necessariaReal-time data synchronization is not required Un indicizzatore può reindicizzare la tabella al massimo ogni 5 minuti.An indexer can re-index your table at most every five minutes. Se i dati vengono modificati di frequente ed è necessario riflettere le modifiche nell’indice entro pochi secondi o pochi minuti, è consigliabile usare l'API REST o l'SDK .NET per eseguire direttamente il push delle righe aggiornate.If your data changes frequently, and the changes need to be reflected in the index within seconds or single minutes, we recommend using the REST API or .NET SDK to push updated rows directly.
L'indicizzazione incrementale è possibileIncremental indexing is possible Se si dispone di un set di dati di grandi dimensioni e si prevede di eseguire l'indicizzatore in una pianificazione, Ricerca di Azure deve essere in grado di identificare in modo efficiente le righe modificate, nuove ed eliminate.If you have a large data set and plan to run the indexer on a schedule, Azure Search must be able to efficiently identify new, changed, or deleted rows. L'indicizzazione incrementale è consentito solo se si esegue l'indicizzazione su richiesta, non programmata, o se la si esegue per meno di 100.000 righe.Non-incremental indexing is only allowed if you're indexing on demand (not on schedule), or indexing fewer than 100,000 rows. Per altre informazioni, vedere Acquisizione delle righe modificate ed eliminate di seguito.For more information, see Capturing Changed and Deleted Rows below.

Creare un indicizzatore SQL di AzureCreate an Azure SQL Indexer

  1. Creare l'origine dati:Create the data source:

     POST https://myservice.search.windows.net/datasources?api-version=2016-09-01
     Content-Type: application/json
     api-key: admin-key
    
     {
         "name" : "myazuresqldatasource",
         "type" : "azuresql",
         "credentials" : { "connectionString" : "Server=tcp:<your server>.database.windows.net,1433;Database=<your database>;User ID=<your user name>;Password=<your password>;Trusted_Connection=False;Encrypt=True;Connection Timeout=30;" },
         "container" : { "name" : "name of the table or view that you want to index" }
     }
    

    È possibile ottenere la stringa di connessione dal portale di Azure. Usare l'opzione ADO.NET connection string.You can get the connection string from the Azure portal; use the ADO.NET connection string option.

  2. Creare un indice di Ricerca di Azure di destinazione, se non ne è già disponibile uno.Create the target Azure Search index if you don’t have one already. È possibile creare un indice usando il portale o l'API Crea indice.You can create an index using the portal or the Create Index API. Assicurarsi che lo schema dell'indice di destinazione sia compatibile con lo schema della tabella di origine. Per informazioni dettagliate, vedere Mapping tra tipi di dati SQL e tipi di dati di Ricerca di Azure.Ensure that the schema of your target index is compatible with the schema of the source table - see mapping between SQL and Azure search data types.

  3. Creare l'indicizzatore assegnandogli un nome e il riferimento all’origine dati e all'indice di destinazione:Create the indexer by giving it a name and referencing the data source and target index:

    POST https://myservice.search.windows.net/indexers?api-version=2016-09-01
    Content-Type: application/json
    api-key: admin-key
    
    {
        "name" : "myindexer",
        "dataSourceName" : "myazuresqldatasource",
        "targetIndexName" : "target index name"
    }
    

Un indicizzatore creato in questo modo non dispone di una pianificazione.An indexer created in this way doesn’t have a schedule. Viene eseguito non appena viene creato.It automatically runs once when it’s created. È possibile rieseguirlo in qualsiasi momento mediante una richiesta di esecuzione indicizzatore :You can run it again at any time using a run indexer request:

POST https://myservice.search.windows.net/indexers/myindexer/run?api-version=2016-09-01
api-key: admin-key

È possibile personalizzare alcuni aspetti del comportamento dell'indicizzatore, ad esempio le dimensioni del batch e il numero di documenti che è possibile ignorare prima che un'esecuzione dell'indicizzatore abbia esito negativo.You can customize several aspects of indexer behavior, such as batch size and how many documents can be skipped before an indexer execution fails. Per altre informazioni, vedere Create Indexer API(Creare un'API di indicizzatore).For more information, see Create Indexer API.

Potrebbe essere necessario consentire ai servizi di Azure di connettersi al database.You may need to allow Azure services to connect to your database. Vedere Connessione da Azure per istruzioni su come eseguire questa operazione.See Connecting From Azure for instructions on how to do that.

Per monitorare lo stato dell'indicizzatore e la cronologia di esecuzione (numero di elementi indicizzati, errori e così via), utilizzare una richiesta di stato indicizzatore :To monitor the indexer status and execution history (number of items indexed, failures, etc.), use an indexer status request:

GET https://myservice.search.windows.net/indexers/myindexer/status?api-version=2016-09-01
api-key: admin-key

La risposta sarà simile alla seguente:The response should look similar to the following:

{
    "@odata.context":"https://myservice.search.windows.net/$metadata#Microsoft.Azure.Search.V2015_02_28.IndexerExecutionInfo",
    "status":"running",
    "lastResult": {
        "status":"success",
        "errorMessage":null,
        "startTime":"2015-02-21T00:23:24.957Z",
        "endTime":"2015-02-21T00:36:47.752Z",
        "errors":[],
        "itemsProcessed":1599501,
        "itemsFailed":0,
        "initialTrackingState":null,
        "finalTrackingState":null
    },
    "executionHistory":
    [
        {
            "status":"success",
            "errorMessage":null,
            "startTime":"2015-02-21T00:23:24.957Z",
            "endTime":"2015-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 nella risposta).Execution history contains up to 50 of the most recently completed executions, which are sorted in the reverse chronological order (so that the latest execution comes first in the response). Sono disponibili informazioni aggiuntive relative alla risposta Ottenere lo stato dell'indicizzatoreAdditional information about the response can be found in Get Indexer Status

Eseguire gli indicizzatori in base a una pianificazioneRun indexers on a schedule

È inoltre possibile fare in modo che l'indicizzatore si esegua periodicamente in base a una pianificazione.You can also arrange the indexer to run periodically on a schedule. A tale scopo, aggiungere la proprietà schedule al momento della creazione o dell'aggiornamento dell'indicizzatore.To do this, add the schedule property when creating or updating the indexer. Nell'esempio seguente viene illustrata una richiesta PUT di aggiornamento dell'indicizzatore:The example below shows a PUT request to update the indexer:

PUT https://myservice.search.windows.net/indexers/myindexer?api-version=2016-09-01
Content-Type: application/json
api-key: admin-key

{
    "dataSourceName" : "myazuresqldatasource",
    "targetIndexName" : "target index name",
    "schedule" : { "interval" : "PT10M", "startTime" : "2015-01-01T00:00:00Z" }
}

È richiesto il parametro interval .The interval parameter is required. L'intervallo fa riferimento al tempo tra l'inizio di due esecuzioni consecutive dell'indicizzatore.The interval refers to the time between the start of two consecutive indexer executions. L'intervallo minimo consentito è di 5 minuti, quello massimo di un giorno.The smallest allowed interval is 5 minutes; the longest is one day. Il valore deve essere formattato come valore XSD "dayTimeDuration" (un subset limitato di un valore duration ISO 8601 ).It must be formatted as an XSD "dayTimeDuration" value (a restricted subset of an ISO 8601 duration value). Il modello è: P(nD)(T(nH)(nM)).The pattern for this is: P(nD)(T(nH)(nM)). Esempi: PT15M ogni 15 minuti, PT2H ogni due ore.Examples: PT15M for every 15 minutes, PT2H for every 2 hours.

Il valore facoltativo startTime indica quando devono essere avviate le esecuzioni pianificate.The optional startTime indicates when the scheduled executions should commence. Se viene omesso, verrà usata l'ora UTC corrente.If it is omitted, the current UTC time is used. Può trattarsi di un'ora del passato, caso in cui la prima esecuzione viene pianificata come se l'indicizzatore fosse stato continuamente in funzione sin dall'ora di inizio.This time can be in the past – in which case the first execution is scheduled as if the indexer has been running continuously since the startTime.

È possibile effettuare solo l'esecuzione di un indicizzatore specificato per volta.Only one execution of an indexer can run at a time. Se un indicizzatore è in uso quando viene pianificata l'esecuzione, l'esecuzione viene rimandata fino al successivo orario pianificato.If an indexer is running when its execution is scheduled, the execution is postponed until the next scheduled time.

Ecco un esempio per rendere il discorso più concreto.Let’s consider an example to make this more concrete. Si supponga che sia configurata la seguente pianificazione oraria:Suppose we the following hourly schedule configured:

"schedule" : { "interval" : "PT1H", "startTime" : "2015-03-01T00:00:00Z" }

Di seguito è illustrato ciò che accade:Here’s what happens:

  1. L’esecuzione del primo indicizzatore comincia il 1 marzo 2015 alle 12:00The first indexer execution starts at or around March 1, 2015 12:00 a.m. UTC più o meno.UTC.
  2. Si supponga che l'esecuzione richieda 20 minuti (o un tempo qualsiasi inferiore a 1 ora).Assume this execution takes 20 minutes (or any time less than 1 hour).
  3. La seconda esecuzione inizia il 1 marzo 2015 alle 13.00, più o menoThe second execution starts at or around March 1, 2015 1:00 a.m.
  4. Si supponga ora che l'esecuzione richieda più di un'ora, ad esempio 70 minuti, e che venga completata alle 02:10 circa.Now suppose that this execution takes more than an hour – for example, 70 minutes – so that it completes around 2:10 a.m.
  5. Ora sono le 02:00, l’ora dell’inizio della terza esecuzione.It’s now 2:00 a.m., time for the third execution to start. Poiché la seconda esecuzione della 01.00However, because the second execution from 1 a.m. è ancora in esecuzione, la terza esecuzione viene saltata.is still running, the third execution is skipped. La terza esecuzione inizia alle 03:00.The third execution starts at 3 a.m.

È possibile aggiungere, modificare o eliminare una pianificazione per un indicizzatore esistente utilizzando una richiesta di indicizzatore PUT .You can add, change, or delete a schedule for an existing indexer by using a PUT indexer request.

Acquisire righe nuove, modificate ed eliminateCapture new, changed, and deleted rows

Ricerca di Azure usa l'indicizzazione incrementale per evitare di reindicizzare l'intera tabella o vista ogni volta che viene eseguito un indicizzatore.Azure Search uses incremental indexing to avoid having to re-index the entire table or view every time an indexer runs. Ricerca di Azure offre che due criteri per il rilevamento delle modifiche per supportare l'indicizzazione incrementale.Azure Search provides two change detection policies to support incremental indexing.

Criteri di rilevamento delle modifiche integrati di SQLSQL Integrated Change Tracking Policy

Se il database SQL supporta il rilevamento delle modifiche, è consigliabile usare i criteri di rilevamento delle modifiche integrati di SQL.If your SQL database supports change tracking, we recommend using SQL Integrated Change Tracking Policy. Questo è il criterio più efficiente.This is the most efficient policy. Inoltre consente a Ricerca di Azure di identificare le righe eliminate senza dover aggiungere allo schema una colonna di "eliminazione temporanea" esplicita.In addition, it allows Azure Search to identify deleted rows without you having to add an explicit "soft delete" column to your table.

RequisitiRequirements

  • Requisiti sulla versione del database:Database version requirements:
    • SQL Server 2012 SP3 e versioni successive, se si usa SQL Server nelle macchine virtuali di Azure.SQL Server 2012 SP3 and later, if you're using SQL Server on Azure VMs.
    • Database SQL di Azure V12, se si utilizza il database SQL di Azure SQL.Azure SQL Database V12, if you're using Azure SQL Database.
  • Solo tabelle, nessuna vista.Tables only (no views).
  • Nel database abilitare il rilevamento della modifica per la tabella.On the database, enable change tracking for the table.
  • Nessuna chiave primaria composta, ovvero una chiave primaria che contiene più di una colonna, nella tabella.No composite primary key (a primary key containing more than one column) on the table.

UtilizzoUsage

Per utilizzare questo criterio, creare o aggiornare l'origine dati nel modo indicato di seguito:To use this policy, create or update your data source like this:

{
    "name" : "myazuresqldatasource",
    "type" : "azuresql",
    "credentials" : { "connectionString" : "connection string" },
    "container" : { "name" : "table or view name" },
    "dataChangeDetectionPolicy" : {
       "@odata.type" : "#Microsoft.Azure.Search.SqlIntegratedChangeTrackingPolicy"
  }
}

Quando si usano i criteri di rilevamento delle modifiche integrati di SQL, non specificare criteri di rilevamento dell'eliminazione dei dati separati, perché questi ultimi includono il supporto predefinito per l'identificazione delle righe eliminate.When using SQL integrated change tracking policy, do not specify a separate data deletion detection policy - this policy has built-in support for identifying deleted rows. Tuttavia, affinché le operazioni di eliminazione vengano rilevate "auto-magicamente", la chiave del documento nell'indice di ricerca deve essere la stessa della chiave primaria nella tabella SQL.However, for the deletes to be detected "automagically", the document key in your search index must be the same as the primary key in the SQL table.

Criteri di rilevamento delle modifiche con limite massimoHigh Water Mark Change Detection policy

Questi criteri di rilevamento delle modifiche si basano su una colonna di "livello più alto" che acquisisce la versione o l'ora dell'ultimo aggiornamento di una riga.This change detection policy relies on a "high water mark" column capturing the version or time when a row was last updated. Se si usa una vista, è consigliabile usare i criteri di livello più alto.If you're using a view, you must use a high water mark policy. La colonna di livello più alto deve soddisfare i requisiti seguenti.The high water mark column must meet the following requirements.

RequisitiRequirements

  • Tutti gli inserimenti specificano un valore per la colonna.All inserts specify a value for the column.
  • Tutti gli aggiornamenti a un elemento modificano anche il valore della colonna.All updates to an item also change the value of the column.
  • Il valore di questa colonna aumenta in base a ogni modifica o aggiornamento.The value of this column increases with each insert or update.
  • Le query con le clausole QUERY e ORDER BY seguenti possono essere eseguite in modo efficiente: WHERE [High Water Mark Column] > [Current High Water Mark Value] ORDER BY [High Water Mark Column]Queries with the following WHERE and ORDER BY clauses can be executed efficiently: WHERE [High Water Mark Column] > [Current High Water Mark Value] ORDER BY [High Water Mark Column]

Importante

È consigliabile usare il tipo di dati rowversion per la colonna di livello più alto.We strongly recommend using the rowversion data type for the high water mark column. Se viene usato un qualsiasi altro tipo di dati, il rilevamento delle modifiche potrebbe non garantire l'acquisizione di tutte le modifiche in presenza di transazioni in esecuzione contemporaneamente a una query dell'indicizzatore.If any other data type is used, change tracking is not guaranteed to capture all changes in the presence of transactions executing concurrently with an indexer query. Quando si usa rowversion in una configurazione con le repliche di sola lettura, è necessario puntare l'indicizzatore alla replica primaria.When using rowversion in a configuration with read-only replicas, you must point the indexer at the primary replica. Per scenari di sincronizzazione dei dati, è possibile usare solo una replica primaria.Only a primary replica can be used for data sync scenarios.

UtilizzoUsage

Per usare questo criterio di limite massimo, creare o aggiornare l'origine dati nel modo seguente:To use a high water mark policy, create or update your data source like this:

{
    "name" : "myazuresqldatasource",
    "type" : "azuresql",
    "credentials" : { "connectionString" : "connection string" },
    "container" : { "name" : "table or view name" },
    "dataChangeDetectionPolicy" : {
       "@odata.type" : "#Microsoft.Azure.Search.HighWaterMarkChangeDetectionPolicy",
       "highWaterMarkColumnName" : "[a rowversion or last_updated column name]"
  }
}

Avviso

Se la tabella di origine non dispone di un indice nella colonna del limite massimo, le query usate dall'indicizzatore SQL possono scadere. In particolare, la clausola ORDER BY [High Water Mark Column] richiede l'esecuzione efficiente di un indice nel caso in cui la tabella contenga numerose righe.If the source table does not have an index on the high water mark column, queries used by the SQL indexer may time out. In particular, the ORDER BY [High Water Mark Column] clause requires an index to run efficiently when the table contains many rows.

Se si verificano errori di timeout, è possibile usare l'impostazione di configurazione dell'indicizzatore queryTimeout per impostare il timeout delle query su un valore superiore rispetto a quello predefinito di 5 minuti.If you encounter timeout errors, you can use the queryTimeout indexer configuration setting to set the query timeout to a value higher than the default 5-minute timeout. Ad esempio, per impostare il timeout su 10 minuti, creare o aggiornare l'indicizzatore con la seguente configurazione:For example, to set the timeout to 10 minutes, create or update the indexer with the following configuration:

{
  ... other indexer definition properties
 "parameters" : {
        "configuration" : { "queryTimeout" : "00:10:00" } }
}

La clausola ORDER BY [High Water Mark Column] può anche essere disabilitata.You can also disable the ORDER BY [High Water Mark Column] clause. Tuttavia, questa operazione è sconsigliata perché, se l'esecuzione dell'indicizzatore è stata interrotta da un errore, l'indicizzatore deve elaborare nuovamente tutte le righe in caso di esecuzione in un secondo momento, anche se l'indicizzatore ha già elaborato quasi tutte le righe nel momento in cui è stata interrotta.However, this is not recommended because if the indexer execution is interrupted by an error, the indexer has to re-process all rows if it runs later - even if the indexer has already processed almost all the rows by the time it was interrupted. Per disabilitare la clausola ORDER BY, usare l'impostazione disableOrderByHighWaterMarkColumn nella definizione dell'indicizzatore:To disable the ORDER BY clause, use the disableOrderByHighWaterMarkColumn setting in the indexer definition:

{
 ... other indexer definition properties
 "parameters" : {
        "configuration" : { "disableOrderByHighWaterMarkColumn" : true } }
}

Criteri di rilevamento eliminazione colonna di eliminazione temporaneaSoft Delete Column Deletion Detection policy

Quando le righe vengono eliminate dalla tabella di origine, è probabile che si desideri eliminarle anche dall’indice di ricerca.When rows are deleted from the source table, you probably want to delete those rows from the search index as well. Se si utilizzano i criteri di rilevamento delle modifiche integrati di SQL, questa operazione è automatica.If you use the SQL integrated change tracking policy, this is taken care of for you. Tuttavia, i criteri di rilevamento delle modifiche limite massimo non sono di supporto all’utente con le righe eliminate.However, the high water mark change tracking policy doesn’t help you with deleted rows. Cosa fare?What to do?

Se le righe vengono rimosse fisicamente dalla tabella, la Ricerca di Azure non può dedurre in alcun modo la presenza di record che non esistono più.If the rows are physically removed from the table, Azure Search has no way to infer the presence of records that no longer exist. Tuttavia, è possibile usare la tecnica di "eliminazione temporanea" per eliminare in modo logico le righe senza rimuoverle dalla tabella.However, you can use the “soft-delete” technique to logically delete rows without removing them from the table. Aggiungere una colonna alla tabella o alla vista e contrassegnare le righe come eliminate tramite la colonna.Add a column to your table or view and mark rows as deleted using that column.

Quando si utilizza la tecnica dell’eliminazione temporanea, è possibile specificare la modalità di eliminazione temporanea come segue se si crea o si aggiorna l’origine dati:When using the soft-delete technique, you can specify the soft delete policy as follows when creating or updating the data source:

{
    …,
    "dataDeletionDetectionPolicy" : {
       "@odata.type" : "#Microsoft.Azure.Search.SoftDeleteColumnDeletionDetectionPolicy",
       "softDeleteColumnName" : "[a column name]",
       "softDeleteMarkerValue" : "[the value that indicates that a row is deleted]"
    }
}

softDeleteMarkerValue deve essere una stringa. Usare la rappresentazione stringa del valore effettivo.The softDeleteMarkerValue must be a string – use the string representation of your actual value. Ad esempio, se si dispone di una colonna di valori integer in cui le righe eliminate sono contrassegnate con il valore 1, usare "1".For example, if you have an integer column where deleted rows are marked with the value 1, use "1". Se si dispone di una colonna BIT in cui le righe eliminate sono contrassegnate con il valore booleano true, usare "True".If you have a BIT column where deleted rows are marked with the Boolean true value, use "True".

Mapping tra tipi di dati SQL e tipi di dati di Ricerca di AzureMapping between SQL and Azure Search data types

Tipo di dati SQLSQL data type Tipi di campi dell'indice di destinazione consentitiAllowed target index field types NoteNotes
bitbit Edm.Boolean, Edm.StringEdm.Boolean, Edm.String
int, smallint, tinyintint, smallint, tinyint Edm.Int32, Edm.Int64, Edm.StringEdm.Int32, Edm.Int64, Edm.String
bigintbigint Edm.Int64, Edm.StringEdm.Int64, Edm.String
real, floatreal, float Edm.Double, Edm.StringEdm.Double, Edm.String
smallmoney, money decimal numericsmallmoney, money decimal numeric Edm.StringEdm.String Ricerca di Azure non supporta la conversione di tipi decimali in Edm.Double, perché in tal caso si perderebbe la precisioneAzure Search does not support converting decimal types into Edm.Double because this would lose precision
char, nchar, varchar, nvarcharchar, nchar, varchar, nvarchar Edm.StringEdm.String
Collection(Edm.String)Collection(Edm.String)
Una stringa SQL può essere usata per popolare un campo Collection(Edm.String) se la stringa rappresenta una matrice JSON di stringhe: ["red", "white", "blue"]A SQL string can be used to populate a Collection(Edm.String) field if the string represents a JSON array of strings: ["red", "white", "blue"]
smalldatetime, datetime, datetime2, date, datetimeoffsetsmalldatetime, datetime, datetime2, date, datetimeoffset Edm.DateTimeOffset, Edm.StringEdm.DateTimeOffset, Edm.String
uniqueidentiferuniqueidentifer Edm.StringEdm.String
geographygeography Edm.GeographyPointEdm.GeographyPoint Sono supportate solo le istanze geografiche di tipo POINT con SRID 4326 (ossia l'impostazione predefinita)Only geography instances of type POINT with SRID 4326 (which is the default) are supported
rowversionrowversion N/DN/A Le colonne di versione di riga non possono essere archiviate nell'indice di ricerca, ma possono essere usate per il rilevamento modificheRow-version columns cannot be stored in the search index, but they can be used for change tracking
time, timespan, binary, varbinary, image, xml, geometry, CLR typestime, timespan, binary, varbinary, image, xml, geometry, CLR types N/DN/A Non supportateNot supported

Impostazioni di configurazioneConfiguration Settings

L'indicizzatore SQL espone diverse impostazioni di configurazione:SQL indexer exposes several configuration settings:

ImpostazioneSetting Tipo di datiData type ScopoPurpose Valore predefinitoDefault value
queryTimeoutqueryTimeout stringstring Imposta il timeout per l'esecuzione di una query SQLSets the timeout for SQL query execution 5 minuti ("00:05:00")5 minutes ("00:05:00")
disableOrderByHighWaterMarkColumndisableOrderByHighWaterMarkColumn boolbool Fa in modo che la query SQL usata dai criteri di limite massimo ometta la clausola ORDER BY.Causes the SQL query used by the high water mark policy to omit the ORDER BY clause. Vedere Criteri di limite massimoSee High Water Mark policy falsefalse

Queste impostazioni vengono usate nell'oggetto parameters.configuration nella definizione dell'indicizzatore.These settings are used in the parameters.configuration object in the indexer definition. Ad esempio, per impostare il timeout della query su 10 minuti, creare o aggiornare l'indicizzatore con la seguente configurazione:For example, to set the query timeout to 10 minutes, create or update the indexer with the following configuration:

{
  ... other indexer definition properties
 "parameters" : {
        "configuration" : { "queryTimeout" : "00:10:00" } }
}

Domande frequentiFAQ

D: Posso usare l'indicizzatore di Azure SQL con i database SQL in esecuzione sulle macchine virtuali IaaS in Azure?Q: Can I use Azure SQL indexer with SQL databases running on IaaS VMs in Azure?

Sì.Yes. Tuttavia, è necessario consentire al servizio di ricerca di connettersi al database.However, you need to allow your search service to connect to your database. Per altre informazioni, vedere l'articolo Configurare una connessione da un indicizzatore di Ricerca di Azure a SQL Server in una VM Azure .For more information, see Configure a connection from an Azure Search indexer to SQL Server on an Azure VM.

D: Posso usare l'indicizzatore di Azure SQL con i database SQL in esecuzione locale?Q: Can I use Azure SQL indexer with SQL databases running on-premises?

Non direttamente.Not directly. La connessione diretta non è consigliata né supportata, in quanto richiederebbe l’apertura dei database al traffico Internet.We do not recommend or support a direct connection, as doing so would require you to open your databases to Internet traffic. I clienti hanno avuto esito positivo in questo scenario grazie all'uso delle tecnologie bridge come Azure Data Factory.Customers have succeeded with this scenario using bridge technologies like Azure Data Factory. Per altre informazioni vedere Push dei dati in un indice di Ricerca di Azure con Azure Data Factory.For more information, see Push data to an Azure Search index using Azure Data Factory.

D: Posso usare l'indicizzatore di Azure SQL con database diversi da SQL Server in esecuzione in IaaS in Azure?Q: Can I use Azure SQL indexer with databases other than SQL Server running in IaaS on Azure?

No.No. Questo scenario non è supportato, in quanto non è stato eseguito il test dell'indicizzatore con database diversi da SQL Server.We don’t support this scenario, because we haven’t tested the indexer with any databases other than SQL Server.

D: Posso creare più indicizzatori in esecuzione in una pianificazione?Q: Can I create multiple indexers running on a schedule?

Sì.Yes. Tuttavia, è possibile eseguire un solo indicizzatore per volta in un nodo.However, only one indexer can be running on one node at one time. Se è necessario eseguire più indicizzatori contemporaneamente, considerare il ridimensionamento del servizio di ricerca a più unità di ricerca.If you need multiple indexers running concurrently, consider scaling up your search service to more than one search unit.

D: L’esecuzione di un indicizzatore influisce sul carico di lavoro della query?Q: Does running an indexer affect my query workload?

Sì.Yes. L'indicizzatore viene eseguito in uno dei nodi del servizio di ricerca e le risorse di tale nodo vengono condivise tra l'indicizzazione e la gestione del traffico di query e altre richieste API.Indexer runs on one of the nodes in your search service, and that node’s resources are shared between indexing and serving query traffic and other API requests. Se si eseguono un'indicizzazione e carichi di lavoro di query intensivi e si verifica una frequenza elevata di errori 503 o un aumento dei tempi di risposta, considerare il ridimensionamento del servizio di ricerca.If you run intensive indexing and query workloads and encounter a high rate of 503 errors or increasing response times, consider scaling up your search service.

D: Posso usare una replica secondaria in un cluster di failover come origine dati?Q: Can I use a secondary replica in a failover cluster as a data source?

Dipende.It depends. Per l'indicizzazione completa di una tabella o vista, è possibile usare una replica secondaria.For full indexing of a table or view, you can use a secondary replica.

Per l'indicizzazione incrementale, Ricerca di Azure supporta due criteri di rilevamento delle modifiche: il rilevamento delle modifiche integrato di SQL e il livello più alto.For incremental indexing, Azure Search supports two change detection policies: SQL integrated change tracking and High Water Mark.

Nelle repliche di sola lettura il database SQL non supporta il rilevamento delle modifiche integrato.On read-only replicas, SQL database does not support integrated change tracking. Pertanto, è necessario usare il criterio del livello più alto.Therefore, you must use High Water Mark policy.

È consigliabile sempre usare il tipo di dati rowversion per la colonna di livello più alto.Our standard recommendation is to use the rowversion data type for the high water mark column. Tuttavia, l'uso di rowversion si basa sulla funzione MIN_ACTIVE_ROWVERSION del Database SQL, che non è supportata nelle repliche di sola lettura.However, using rowversion relies on SQL Database's MIN_ACTIVE_ROWVERSION function, which is not supported on read-only replicas. Pertanto, se si usa rowversion è necessario puntare l'indicizzatore a una replica primaria.Therefore, you must point the indexer to a primary replica if you are using rowversion.

Se si tenta di usare rowversion su una replica di sola lettura, si visualizzerà l'errore seguente:If you attempt to use rowversion on a read-only replica, you will see the following error:

"Using a rowversion column for change tracking is not supported on secondary (read-only) availability replicas. Please update the datasource and specify a connection to the primary availability replica.Current database 'Updateability' property is 'READ_ONLY'".

D: Posso usare una colonna diversa, non rowversion, per il rilevamento delle modifiche del livello più alto?Q: Can I use an alternative, non-rowversion column for high water mark change tracking?

Non è consigliabile.It's not recommended. Solo rowversion consente una sincronizzazione dei dati affidabile.Only rowversion allows for reliable data synchronization. Tuttavia, a seconda della logica dell'applicazione, potrebbe essere sicuro:However, depending on your application logic, it may be safe if:

  • Accertarsi che, durante l'esecuzione dell'indicizzatore, non siano presenti transazioni in sospeso nella tabella che si sta indicizzando. Ad esempio, tutti gli aggiornamenti della tabella vengono eseguiti come batch in una pianificazione e la pianificazione dell'indicizzatore di Ricerca di Azure è impostato per evitare la sovrapposizione con la pianificazione dell'aggiornamento della tabella.You can ensure that when the indexer runs, there are no outstanding transactions on the table that’s being indexed (for example, all table updates happen as a batch on a schedule, and the Azure Search indexer schedule is set to avoid overlapping with the table update schedule).

  • Eseguire periodicamente una reindicizzazione completa per prelevare le righe mancanti.You periodically do a full reindex to pick up any missed rows.