Verbinden und Indizieren von Azure SQL-Datenbankinhalten unter Verwendung von Azure Search-IndexernConnect to and index Azure SQL Database content using Azure Search indexers

Bevor Sie einen Azure Search-Index abfragen können, müssen Sie ihn mit Daten auffüllen.Before you can query an Azure Search index, you must populate it with your data. Wenn sich die Daten in einer Azure SQL-Datenbank befinden, können Sie mit dem neuen Feature Azure Search-Indexer für Azure SQL-Datenbank (oder kurz Azure SQL-Indexer) den Indizierungsprozess automatisieren. Sie müssen also weniger Code schreiben und sich weniger Gedanken über die Infrastruktur machen.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 diesem Artikel wird die Verwendung von Indexern behandelt, es werden aber auch Features beschrieben, die nur bei Azure SQL-Datenbanken verfügbar sind (z. B. die integrierte Änderungsnachverfolgung).This article covers the mechanics of using indexers, but also describes features only available with Azure SQL databases (for example, integrated change tracking).

Zusätzlich zu Azure SQL-Datenbanken bietet Azure Search Indexer für Azure Cosmos DB, Azure Blob Storage und Azure Table Storage.In addition to Azure SQL databases, Azure Search provides indexers for Azure Cosmos DB, Azure Blob storage, and Azure table storage. Um Unterstützung für andere Datenquellen anzufordern, geben Sie im Forum für Feedback zu Azure Search Feedback.To request support for other data sources, provide your feedback on the Azure Search feedback forum.

Indexer und DatenquellenIndexers and data sources

Eine Datenquelle gibt an, welche Daten indiziert werden müssen. Sie legt außerdem die Anmeldeinformationen für den Datenzugriff sowie die Richtlinien fest, mit denen Änderungen an den Daten effizient identifiziert werden können (z.B. neue, geänderte oder gelöschte Zeilen).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). Die Datenquelle wird als unabhängige Ressource definiert, sodass sie von mehreren Indexern verwendet werden kann.It's defined as an independent resource so that it can be used by multiple indexers.

Ein Indexer ist eine Ressource, die eine einzelne Datenquelle mit einem Zielsuchindex verbindet.An indexer is a resource that connects a single data source with a targeted search index. Ein Indexer kann folgendermaßen verwendet werden:An indexer is used in the following ways:

  • Eine einmalige Kopie der Daten zum Auffüllen eines Indexes ausführen.Perform a one-time copy of the data to populate an index.
  • Einen Index mit Änderungen an der Datenquelle nach einem Zeitplan aktualisieren.Update an index with changes in the data source on a schedule.
  • Ausführung bei Bedarf, um den Index je nach Notwendigkeit zu aktualisieren.Run on-demand to update an index as needed.

Ein einzelner Indexer kann nur eine Tabelle oder Sicht verwenden, aber Sie können mehrere Indexer erstellen, wenn Sie mehrere Suchindizes auffüllen möchten.A single indexer can only consume one table or view, but you can create multiple indexers if you want to populate multiple search indexes. Weitere Informationen zu Konzepten finden Sie unter Indexer-Vorgänge: Typischer Workflow.For more information on concepts, see Indexer Operations: Typical workflow.

Sie können einen Azure SQL-Indexer wie folgt einrichten und konfigurieren:You can set up and configure an Azure SQL indexer using:

In diesem Artikel wird die REST-API verwendet, um Indexer und Datenquellen zu erstellen.In this article, we'll use the REST API to create indexers and data sources.

Gründe für die Verwendung von Azure SQL-IndexernWhen to use Azure SQL Indexer

Abhängig von verschiedenen Faktoren, die mit den Daten zusammenhängen, kann die Verwendung von Azure SQL-Indexern angebracht oder nicht angebracht sein.Depending on several factors relating to your data, the use of Azure SQL indexer may or may not be appropriate. Wenn Ihre Daten die folgenden Anforderungen erfüllen, können Sie Azure SQL-Indexer verwenden.If your data fits the following requirements, you can use Azure SQL indexer.

KriterienCriteria DetailsDetails
Die Daten stammen aus einer einzelnen Tabelle oder Sicht.Data originates from a single table or view Wenn die Daten auf mehrere Tabellen verteilt sind, können Sie eine Sicht der Daten erstellen.If the data is scattered across multiple tables, you can create a single view of the data. Bei Verwendung einer Sicht können Sie jedoch nicht die in SQL Server integrierte Änderungserkennung nutzen, um einen Index mit inkrementellen Änderungen zu aktualisieren.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. Weitere Informationen finden Sie unter Erfassen geänderter und gelöschter Zeilen weiter unten.For more information, see Capturing Changed and Deleted Rows below.
Datentypen sind kompatibelData types are compatible In einen Azure Search-Index werden die meisten, aber nicht alle SQL-Typen unterstützt.Most but not all the SQL types are supported in an Azure Search index. Eine Liste finden Sie unter Zuordnen von Datentypen.For a list, see Mapping data types.
Synchronisierung von Daten in Echtzeit ist nicht erforderlichReal-time data synchronization is not required Ein Indexer kann die Tabelle höchstens alle fünf Minuten erneut indizieren.An indexer can reindex your table at most every five minutes. Wenn sich Ihre Daten häufig ändern und die Änderungen innerhalb von Sekunden oder weniger Minuten im Index widergespiegelt werden müssen, sollten Sie die REST-API oder das .NET SDK verwenden, um aktualisierte Zeilen direkt zu übertragen.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.
Inkrementelle Indizierung ist möglichIncremental indexing is possible Wenn Sie ein großes Dataset haben und den Indexer nach einem Zeitplan ausführen möchten, muss Azure Search in der Lage sein, effizient neue, geänderte oder gelöschte Zeilen zu identifizieren.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. Eine nicht inkrementelle Indizierung ist nur zulässig, wenn Sie bei Bedarf indizieren (nicht gemäß Zeitplan) oder wenn Sie weniger als 100.000 Zeilen indizieren.Non-incremental indexing is only allowed if you're indexing on demand (not on schedule), or indexing fewer than 100,000 rows. Weitere Informationen finden Sie unter Erfassen geänderter und gelöschter Zeilen weiter unten.For more information, see Capturing Changed and Deleted Rows below.

Hinweis

Azure Search unterstützt nur die SQL Server-Authentifizierung.Azure Search supports SQL Server authentication only. Sollten Sie die Azure Active Directory-Kennwortauthentifizierung benötigen, stimmen Sie bitte für diesen UserVoice-Vorschlag ab.If you require support for Azure Active Directory Password authentication, please vote for this UserVoice suggestion.

Erstellen eines Azure SQL-IndexersCreate an Azure SQL Indexer

  1. Erstellen Sie die Datenquelle:Create the data source:

     POST https://myservice.search.windows.net/datasources?api-version=2019-05-06
     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" }
     }
    

    Sie können die Verbindungszeichenfolge mit der Option ADO.NET connection string aus dem Azure-Portal abrufen.You can get the connection string from the Azure portal; use the ADO.NET connection string option.

  2. Erstellen Sie den Azure Search-Zielindex, sofern Sie bislang über keinen Index verfügen.Create the target Azure Search index if you don’t have one already. Sie können einen Index über das Portal oder mit der API zur Indexerstellung erstellen.You can create an index using the portal or the Create Index API. Stellen Sie sicher, dass das Schema des Zielindexes mit dem Schema der Quelltabelle kompatibel ist – siehe dazu Zuordnung zwischen SQL-Datentypen und Azure Search-Datentypen.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. Erstellen Sie den Indexer, indem Sie ihm einen Namen geben und einen Verweis auf die Datenquelle und den Zielindex hinzufügen: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=2019-05-06
    Content-Type: application/json
    api-key: admin-key
    
    {
        "name" : "myindexer",
        "dataSourceName" : "myazuresqldatasource",
        "targetIndexName" : "target index name"
    }
    

Ein auf diese Weise erstellter Indexer verfügt über keinen Zeitplan.An indexer created in this way doesn’t have a schedule. Er wird automatisch einmal ausgeführt, wenn er erstellt wird.It automatically runs once when it’s created. Sie können ihn jederzeit mithilfe der Anforderung run indexer erneut ausführen:You can run it again at any time using a run indexer request:

POST https://myservice.search.windows.net/indexers/myindexer/run?api-version=2019-05-06
api-key: admin-key

Sie können einige Aspekte des Indexerverhaltens anpassen, z.B. die Batchgröße, und wie viele Dokumente übersprungen werden können, bevor bei einer Indexerausführung ein Fehler auftritt.You can customize several aspects of indexer behavior, such as batch size and how many documents can be skipped before an indexer execution fails. Weitere Informationen finden Sie unter Create Indexer API (API zum Erstellen eines Indexers).For more information, see Create Indexer API.

Möglicherweise müssen Sie Azure Services erlauben, eine Verbindung mit der Datenbank herzustellen.You may need to allow Azure services to connect to your database. Anleitungen dazu finden Sie unter Verbinden von Azure .See Connecting From Azure for instructions on how to do that.

Verwenden Sie zum Überwachen des Indexerstatus und Ausführungsverlaufs (Anzahl der indizierten Elemente, Fehler usw.) die Anforderung indexer status :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=2019-05-06
api-key: admin-key

Die Antwort sollte etwa wie folgt aussehen: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
    ]
}

Der Ausführungsverlauf enthält bis zu 50 der zuletzt abgeschlossenen Ausführungen. Diese sind in umgekehrter chronologischer Reihenfolge sortiert (somit wird die neueste Ausführung als Erstes in der Antwort aufgelistet).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). Weitere Informationen zur Antwort finden Sie unter Abrufen des Indexerstatus.Additional information about the response can be found in Get Indexer Status

Ausführen von Indexern nach einem ZeitplanRun indexers on a schedule

Sie können den Indexer auch so konfigurieren, dass er regelmäßig nach einem Zeitplan ausgeführt wird.You can also arrange the indexer to run periodically on a schedule. Dazu fügen Sie die schedule-Eigenschaft beim Erstellen oder Aktualisieren des Indexers hinzu.To do this, add the schedule property when creating or updating the indexer. Das folgende Beispiel zeigt eine PUT-Anforderung den Indexer, um den zu aktualisieren:The example below shows a PUT request to update the indexer:

PUT https://myservice.search.windows.net/indexers/myindexer?api-version=2019-05-06
Content-Type: application/json
api-key: admin-key

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

Der Parameter interval ist erforderlich.The interval parameter is required. Das Intervall bezieht sich auf den Zeitraum zwischen dem Start von zwei aufeinander folgenden Indexerausführungen.The interval refers to the time between the start of two consecutive indexer executions. Das kleinste zulässige Intervall beträgt 5 Minuten. Das längste ist ein Tag.The smallest allowed interval is 5 minutes; the longest is one day. Es muss als XSD-Wert „dayTimeDuration“ formatiert sein (eine eingeschränkte Teilmenge eines ISO 8601-Zeitwerts).It must be formatted as an XSD "dayTimeDuration" value (a restricted subset of an ISO 8601 duration value). Das Muster hierfür lautet wie folgt: P(nD)(T(nH)(nM)).The pattern for this is: P(nD)(T(nH)(nM)). Beispiele: PT15M = alle 15 Minuten, PT2H = alle 2 Stunden.Examples: PT15M for every 15 minutes, PT2H for every 2 hours.

Weitere Informationen zum Definieren von Indexerzeitplänen finden Sie unter Indexerzeitpläne für Azure Search.For more information about defining indexer schedules see How to schedule indexers for Azure Search.

Erfassen neuer, geänderter und gelöschter ZeilenCapture new, changed, and deleted rows

Azure Search verwendet eine inkrementelle Indizierung, um zu vermeiden, dass die gesamte Tabelle oder Sicht jedes Mal neu indiziert wird, wenn ein Indexer ausgeführt wird.Azure Search uses incremental indexing to avoid having to reindex the entire table or view every time an indexer runs. Azure Search bietet zwei Richtlinien zur Erkennung von Änderungen, um die inkrementelle Indizierung zu unterstützen.Azure Search provides two change detection policies to support incremental indexing.

Richtlinie für die integrierte SQL-ÄnderungsnachverfolgungSQL Integrated Change Tracking Policy

Wenn die SQL-Datenbank die Änderungsnachverfolgungunterstützt, wird empfohlen, die Richtlinie für die integrierte SQL-Änderungsnachverfolgungzu verwenden.If your SQL database supports change tracking, we recommend using SQL Integrated Change Tracking Policy. Dies ist die effizienteste Richtlinie.This is the most efficient policy. Zudem sorgt sie dafür, dass Azure Search gelöschte Zeilen identifiziert, ohne dass Sie eine explizite „Vorläufig löschen“-Spalte in Ihrer Tabelle angeben müssen.In addition, it allows Azure Search to identify deleted rows without you having to add an explicit "soft delete" column to your table.

Requirements (Anforderungen)Requirements

  • Anforderungen für die Datenbankversion:Database version requirements:
    • SQL Server 2012 SP3 und höher bei Verwendung von SQL Server auf Azure-VMs.SQL Server 2012 SP3 and later, if you're using SQL Server on Azure VMs.
    • Azure SQL-Datenbank V12 bei Verwendung von Azure SQL-Datenbank.Azure SQL Database V12, if you're using Azure SQL Database.
  • Nur Tabellen (keine Sichten).Tables only (no views).
  • Aktiveren Sie in der Datenbank die Änderungsnachverfolgung für die Tabelle.On the database, enable change tracking for the table.
  • Kein zusammengesetzter Primärschlüssel (ein Primärschlüssel mit mehr als einer Spalte) für die Tabelle.No composite primary key (a primary key containing more than one column) on the table.

VerwendungUsage

Um diese Richtlinie zu verwenden, erstellen oder aktualisieren Sie die Datenquelle wie folgt: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"
  }
}

Wenn Sie die Richtlinie für die integrierte SQL-Änderungsnachverfolgung verwenden, geben Sie keine separate Richtlinie für das Erkennen gelöschter Daten an. Die Identifizierung gelöschter Zeilen wird von der Richtlinie bereits unterstützt.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. Damit die Löschvorgänge „automatisch“ erkannt werden, muss der Dokumentschlüssel im Suchindex allerdings mit dem Primärschlüssel in der SQL-Tabelle übereinstimmen.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.

Hinweis

Wenn Sie TRUNCATE TABLE verwenden, um eine große Anzahl von Zeilen aus einer SQL-Tabelle zu entfernen, muss der Indexer zurückgesetzt werden, um den Änderungsverfolgungszustand zurückzusetzen und Zeilenlöschungen aufzunehmen.When using TRUNCATE TABLE to remove a large number of rows from a SQL table, the indexer needs to be reset to reset the change tracking state to pick up row deletions.

Richtlinie zum Erkennen von Änderungen mit oberem GrenzwertHigh Water Mark Change Detection policy

Diese Richtlinie zur Erkennung von Änderungen basiert auf einer Spalte mit oberem Grenzwert, die Version oder Uhrzeit der letzten Aktualisierung einer Zeile erfasst.This change detection policy relies on a "high water mark" column capturing the version or time when a row was last updated. Bei Verwendung einer Sicht müssen Sie eine Richtlinie mit oberem Grenzwert einsetzen.If you're using a view, you must use a high water mark policy. Die Spalte mit dem oberen Grenzwert muss die folgenden Anforderungen erfüllen.The high water mark column must meet the following requirements.

Requirements (Anforderungen)Requirements

  • Alle Einfügungen geben einen Wert für die Spalte an.All inserts specify a value for the column.
  • Alle Updates für ein Element ändern auch den Wert der Spalte.All updates to an item also change the value of the column.
  • Der Wert dieser Spalte wird bei jeder Einfügung oder Aktualisierung erhöht.The value of this column increases with each insert or update.
  • Abfragen mit den folgenden WHERE- und ORDER BY-Klauseln können effizient ausgeführt werden: 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]

Wichtig

Es wird dringend empfohlen, den Datentyp rowversion für die Spalte mit dem oberen Grenzwert zu verwenden.We strongly recommend using the rowversion data type for the high water mark column. Wenn ein anderer Datentyp verwendet wird, ist nicht sichergestellt, dass bei der Änderungsnachverfolgung alle Änderungen erfasst werden, wenn Transaktionen gleichzeitig mit einer Indexerabfrage ausgeführt werden.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. Bei Verwendung von rowversion in einer Konfiguration mit schreibgeschützten Replikaten müssen Sie den Indexer auf das primäre Replikat verweisen.When using rowversion in a configuration with read-only replicas, you must point the indexer at the primary replica. Nur ein primäres Replikat kann für Szenarien zur Datensynchronisierung verwendet werden.Only a primary replica can be used for data sync scenarios.

VerwendungUsage

Um eine Richtlinie mit oberem Grenzwert anzuwenden, erstellen oder aktualisieren Sie die Datenquelle wie folgt: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]"
  }
}

Warnung

Wenn die Quelltabelle keinen Index für die Spalte mit dem oberen Grenzwert enthält, kann das Zeitlimit für die vom SQL-Indexer verwendeten Abfragen überschritten werden. Insbesondere die Klausel ORDER BY [High Water Mark Column] erfordert für die effiziente Ausführung einen Index, wenn die Tabelle viele Zeilen enthält.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.

Wenn Timeoutfehler auftreten, können Sie mithilfe der Indexer-Konfigurationseinstellung queryTimeout das Abfragetimeout auf einen höheren Wert als das Standardtimeout von 5 Minuten festlegen.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. Um das Timeout z.B. auf 10 Minuten festzulegen, erstellen oder aktualisieren Sie den Indexer mit der folgenden Konfiguration: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" } }
}

Sie können auch die Klausel ORDER BY [High Water Mark Column] deaktivieren.You can also disable the ORDER BY [High Water Mark Column] clause. Dies wird jedoch nicht empfohlen, da bei Unterbrechung der Indexer-Ausführung aufgrund eines Fehlers der Indexer alle Zeilen erneut verarbeiten muss, wenn er später ausgeführt wird, auch wenn zum Zeitpunkt der Unterbrechung bereits nahezu alle Zeilen verarbeitet wurden.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. Zum Deaktivieren der Klausel ORDER BY verwenden Sie die Einstellung disableOrderByHighWaterMarkColumn in der Indexer-Definition:To disable the ORDER BY clause, use the disableOrderByHighWaterMarkColumn setting in the indexer definition:

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

Richtlinie zum Erkennen von Löschungen anhand der Spalte „Vorläufig löschen“Soft Delete Column Deletion Detection policy

Wenn Zeilen aus der Quelltabelle gelöscht werden, sollten Sie diese Zeilen auch aus dem Suchindex löschen.When rows are deleted from the source table, you probably want to delete those rows from the search index as well. Wenn Sie die Richtlinie für die integrierte SQL-Änderungsnachverfolgung verwenden, müssen Sie sich nicht darum kümmern, weil es automatisch geschieht.If you use the SQL integrated change tracking policy, this is taken care of for you. Die Richtlinie zum Erkennen von Änderungen mit oberem Grenzwert hilft Ihnen allerdings nicht beim Löschen von Zeilen.However, the high water mark change tracking policy doesn’t help you with deleted rows. VorgehensweiseWhat to do?

Wenn Zeilen physisch aus der Tabelle entfernt werden, gibt es in Azure Search keine Möglichkeit, das Vorhandensein von Datensätzen, die nicht mehr vorhanden sind, abzuleiten.If the rows are physically removed from the table, Azure Search has no way to infer the presence of records that no longer exist. Mit der Methode des „vorläufigen Löschens“ können Sie jedoch Zeilen logisch löschen, ohne sie aus der Tabelle zu entfernen.However, you can use the “soft-delete” technique to logically delete rows without removing them from the table. Fügen Sie dazu der Tabelle eine Spalte hinzu, um Zeilen unter Verwendung dieser Spalte anzuzeigen und als gelöscht zu markieren.Add a column to your table or view and mark rows as deleted using that column.

Wenn Sie die Methode des "vorläufigen Löschens" verwenden, können Sie die Richtlinie zum Erkennen von Löschungen anhand der "Vorläufig löschen"-Spalte wie folgt beim Erstellen oder Aktualisieren der Datenquelle angeben: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 muss eine Zeichenfolge sein. Verwenden Sie die Zeichenfolgendarstellung des tatsächlichen Werts.The softDeleteMarkerValue must be a string – use the string representation of your actual value. Wenn Sie z.B. über eine „integer“-Spalte verfügen, in der gelöschte Zeilen durch den Wert 1 gekennzeichnet sind, verwenden Sie "1".For example, if you have an integer column where deleted rows are marked with the value 1, use "1". Wenn Sie über eine BIT-Spalte verfügen, in der gelöschte Zeilen durch den booleschen Wert TRUE gekennzeichnet sind, verwenden Sie das Zeichenfolgenliteral True oder true (die Groß- und Kleinschreibung spielt keine Rolle).If you have a BIT column where deleted rows are marked with the Boolean true value, use the string literal True or true, the case doesn't matter.

Zuordnung zwischen SQL- und Azure Search-DatentypenMapping between SQL and Azure Search data types

SQL-DatentypSQL data type Zulässige Ziel-Index-FeldtypenAllowed target index field types NotizenNotes
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 Azure Search unterstützt nicht die Konvertierung von Dezimaltypen in Edm.Double-Typen, da es hierbei zu Genauigkeitsverlusten kommt.Azure 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)
Eine SQL-Zeichenfolge kann zum Auffüllen eines Collection(Edm.String)-Felds verwendet werden, wenn die Zeichenfolge ein JSON-Array von Zeichenfolgen darstellt: ["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 Es werden nur Geography-Instanzen vom Typ POINT mit SRID 4326 (Standard) unterstützt.Only geography instances of type POINT with SRID 4326 (which is the default) are supported
rowversionrowversion N/A rowversion-Spalten können nicht im Suchindex gespeichert werden, sie können jedoch für die Änderungsnachverfolgung verwendet werden.Row-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/A Nicht unterstütztNot supported

KonfigurationseinstellungenConfiguration Settings

SQL-Indexer verfügt über mehrere Konfigurationseinstellungen:SQL indexer exposes several configuration settings:

EinstellungSetting DatentypData type ZweckPurpose StandardwertDefault value
queryTimeoutqueryTimeout Zeichenfolgestring Legt das Timeout für die Ausführung einer SQL-Abfrage festSets the timeout for SQL query execution 5 Minuten („00:05:00“)5 minutes ("00:05:00")
disableOrderByHighWaterMarkColumndisableOrderByHighWaterMarkColumn boolbool Bewirkt, dass bei der von der Richtlinie zum Erkennen von Änderungen mit oberem Grenzwert verwendeten SQL-Abfrage die ORDER BY-Klausel weggelassen wird.Causes the SQL query used by the high water mark policy to omit the ORDER BY clause. Siehe Richtlinie zum Erkennen von Änderungen mit oberem Grenzwert.See High Water Mark policy falsefalse

Diese Einstellungen werden im parameters.configuration-Objekt in der Indexer-Definition verwendet.These settings are used in the parameters.configuration object in the indexer definition. Um das Abfragetimeout z.B. auf 10 Minuten festzulegen, erstellen oder aktualisieren Sie den Indexer mit der folgenden Konfiguration: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" } }
}

Häufig gestellte FragenFAQ

F: Kann ich Azure SQL-Indexer mit SQL-Datenbanken verwenden, die auf IaaS-VMs in Azure ausgeführt werden?Q: Can I use Azure SQL indexer with SQL databases running on IaaS VMs in Azure?

Ja.Yes. Sie müssen jedoch die Verbindung des Suchdiensts mit der Datenbank ermöglichen.However, you need to allow your search service to connect to your database. Weitere Informationen finden Sie im Artikel Konfigurieren einer Verbindung eines Azure Search-Indexers mit SQL Server auf einer Azure-VM.For more information, see Configure a connection from an Azure Search indexer to SQL Server on an Azure VM.

F: Kann ich Azure SQL-Indexer mit SQL-Datenbanken verwenden, die lokal ausgeführt werden?Q: Can I use Azure SQL indexer with SQL databases running on-premises?

Nicht direkt.Not directly. Weder empfehlen noch unterstützen wir eine direkte Verbindung, da Sie die Datenbanken dann für den Internetdatenverkehr öffnen müssten.We do not recommend or support a direct connection, as doing so would require you to open your databases to Internet traffic. Kunden waren bei diesem Szenario mit Brückentechnologien wie Azure Data Factory erfolgreich.Customers have succeeded with this scenario using bridge technologies like Azure Data Factory. Weitere Informationen finden Sie unter Push-Übertragung von Daten in den Azure Search-Index mithilfe von Azure Data Factory.For more information, see Push data to an Azure Search index using Azure Data Factory.

F: Kann ich Azure SQL-Indexer mit anderen Datenbanken als SQL Server in IaaS auf Azure verwenden?Q: Can I use Azure SQL indexer with databases other than SQL Server running in IaaS on Azure?

Nein.No. Wir unterstützen dieses Szenario nicht, da wir den Indexer mit keinen anderen Datenbanken als SQL Server getestet haben.We don’t support this scenario, because we haven’t tested the indexer with any databases other than SQL Server.

F: Kann ich mehrere Indexer erstellen, die nach einem Zeitplan ausgeführt werden?Q: Can I create multiple indexers running on a schedule?

Ja.Yes. Allerdings kann zu einem gegebenen Zeitpunkt nur ein Indexer auf einem Knoten ausgeführt werden.However, only one indexer can be running on one node at one time. Wenn mehrere Indexer gleichzeitig ausgeführt werden sollen, sollten Sie den Suchdienst skalieren und mehrere Sucheinheiten einsetzen.If you need multiple indexers running concurrently, consider scaling up your search service to more than one search unit.

F: Wirkt sich die Ausführung eines Indexers auf meine Abfrageworkloads aus?Q: Does running an indexer affect my query workload?

Ja.Yes. Indexer werden auf einem der Knoten im Suchdienst ausgeführt, und die Ressourcen dieses Knotens werden für die Indizierung und das Bearbeiten des Datenverkehrs für Abfragen und andere API-Anforderungen gemeinsam genutzt.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. Wenn Sie intensive Indizierungs- und Abfrageworkloads ausführen und viele 503-Fehler oder zunehmend längere Antwortzeiten auftreten, sollten Sie Ihren Suchdienst skalieren.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.

F: Kann ich ein sekundäres Replikat in einem Failovercluster als Datenquelle verwenden?Q: Can I use a secondary replica in a failover cluster as a data source?

Das ist unterschiedlich.It depends. Für die vollständige Indizierung einer Tabelle oder Sicht können Sie ein sekundäres Replikat verwenden.For full indexing of a table or view, you can use a secondary replica.

Für die inkrementelle Indizierung unterstützt Azure Search zwei Richtlinien zur Erkennung von Änderungen: die integrierte SQL-Änderungsnachverfolgung und den oberem Grenzwert.For incremental indexing, Azure Search supports two change detection policies: SQL integrated change tracking and High Water Mark.

Bei schreibgeschützten Replikaten unterstützt SQL-Datenbank die integrierte Änderungsnachverfolgung nicht.On read-only replicas, SQL database does not support integrated change tracking. Aus diesem Grund müssen Sie die Richtlinie mit oberem Grenzwert verwenden.Therefore, you must use High Water Mark policy.

Unsere Standardempfehlung ist den Datentyp „rowversion“ für die Spalte mit dem oberen Grenzwert zu verwenden.Our standard recommendation is to use the rowversion data type for the high water mark column. Allerdings muss für „rowversion“ die Funktion MIN_ACTIVE_ROWVERSION von SQL-Datenbank verwendet werden, die nicht für schreibgeschützte Replikate unterstützt wird.However, using rowversion relies on SQL Database's MIN_ACTIVE_ROWVERSION function, which is not supported on read-only replicas. Aus diesem Grund müssen Sie den Indexer auf ein primäres Replikat verweisen, wenn Sie „rowversion“ verwenden.Therefore, you must point the indexer to a primary replica if you are using rowversion.

Wenn Sie versuchen, „rowversion“ bei einem schreibgeschützten Replikat zu verwenden, wird die folgende Fehlermeldung angezeigt: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'".

F: Kann ich eine alternative Spalte mit einem anderen Typ als „rowversion“ für die Änderungsnachverfolgung mit oberem Grenzwert verwenden?Q: Can I use an alternative, non-rowversion column for high water mark change tracking?

Dies ist nicht empfehlenswert.It's not recommended. Nur rowversion ermöglicht eine zuverlässige Datensynchronisierung.Only rowversion allows for reliable data synchronization. Je nach Anwendungslogik kann es jedoch möglicherweise in folgendem Fall machbar sein:However, depending on your application logic, it may be safe if:

  • Sie können sicherstellen, dass bei der Ausführung des Indexers keine ausstehenden Transaktionen für die Tabelle vorhanden sind, die indiziert wird (z.B. alle Tabellenaktualisierungen werden als ein Batch nach einem Zeitplan ausgeführt, und der Zeitplan des Azure Search-Indexers ist so festgelegt, dass er sich nicht mit dem Zeitplan der Tabellenaktualisierung überschneidet).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).

  • Sie führen in regelmäßigen Abständen eine vollständige erneute Indizierung aus, damit alle fehlenden Zeilen übernommen werden.You periodically do a full reindex to pick up any missed rows.