Share via


Indexer des données à partir du serveur flexible Azure Database pour MySQL

Important

MySQL est pris en charge en préversion publique dans le cadre de Conditions d’utilisation supplémentaires. Utilisez une préversion de l’API REST (2020-06-30-preview ou ultérieure) pour indexer votre contenu. Il n’y a actuellement pas de prise en charge du portail.

Dans cet article, découvrez comment configurer un indexeur qui importe du contenu d’Azure Database pour MySQL et le rend utilisable dans une requête de Azure AI Search. Les entrées de l’indexeur sont votre ligne, dans une seule table ou vue. La sortie est un index de recherche avec du contenu pouvant faire l’objet de recherches dans des champs individuels.

Cet article vient en complément de l’article Créer un indexeur avec des informations spécifiques à l’indexation à partir du serveur flexible Azure Database pour MySQL. Il utilise les API REST pour illustrer un workflow en trois parties commun à tous les indexeurs : créer une source de données, créer un index, créer un indexeur. L’extraction de données se produit quand vous envoyez la demande de création d’un indexeur.

Lorsqu’il est configuré pour inclure une limite supérieure et une suppression réversible, l’indexeur prend en compte toutes les modifications, tous les chargements et toutes les suppressions de votre base de données MySQL. Il reflète ces modifications dans votre index de recherche. L’extraction de données se produit quand vous envoyez la demande de création d’un indexeur.

Prérequis

  • Inscrivez-vous à la préversion pour donner votre avis sur le scénario. Vous pouvez accéder automatiquement à la fonctionnalité après l’envoi du formulaire.

  • Serveur flexible Azure Database pour MySQL et échantillon de données. Les données doivent résider dans une table ou une vue. Une clé primaire est requise. Si vous utilisez une vue, elle doit avoir une colonne de limite supérieure.

  • Autorisations de lecture. Une chaîne de connexion accès complet ajoute une clé qui accorde l’accès au contenu, mais si vous utilisez des rôles Azure, vérifiez que l’identité managée du service de recherche a des autorisations de Lecteur sur MySQL.

  • Un client REST pour créer la source de données, l’index et l’indexeur.

    Vous pouvez également utiliser le SDK Azure pour .NET. Vous ne pouvez pas utiliser le portail pour la création d’indexeur, mais vous pouvez gérer des indexeurs et des sources de données une fois qu’ils sont créés.

Limitations de la version préliminaire

Actuellement, le suivi des modifications et la détection des suppressions ne fonctionnent pas si la date ou le timestamp est uniforme pour toutes les lignes. Cette limitation est un problème connu qui sera traité dans une mise à jour de la préversion. Tant que ce problème n’est pas résolu, n’ajoutez pas d’ensembles de compétences à l’indexeur MySQL.

La préversion ne prend pas en charge les types de géométrie ni les blobs.

Comme indiqué, il n’y a pas de prise en charge de la création d’indexeur dans le portail, mais un indexeur et une source de données MySQL peuvent être gérés dans le portail une fois qu’ils existent. Par exemple, vous pouvez modifier les définitions ainsi que réinitialiser, exécuter ou planifier l’indexeur.

Définir la source de données

La définition de la source de données spécifie les données à indexer, les informations d’identification et les stratégies permettant d’identifier les changements de données. La source de données est définie en tant que ressource indépendante de manière à pouvoir être utilisée par plusieurs indexeurs.

Créer ou mettre à jour une source de données spécifie la définition. Veillez à utiliser une préversion de l’API REST (2020-06-30-Preview ou version ultérieure) lors de la création de la source de données.

{   
    "name" : "hotel-mysql-ds",
    "description" : "[Description of MySQL data source]",
    "type" : "mysql",
    "credentials" : { 
        "connectionString" : 
            "Server=[MySQLServerName].MySQL.database.azure.com; Port=3306; Database=[DatabaseName]; Uid=[UserName]; Pwd=[Password]; SslMode=Preferred;" 
    },
    "container" : { 
        "name" : "[TableName]" 
    },
    "dataChangeDetectionPolicy" : { 
        "@odata.type": "#Microsoft.Azure.Search.HighWaterMarkChangeDetectionPolicy",
        "highWaterMarkColumnName": "[HighWaterMarkColumn]"
    }
}

Points essentiels :

  • Définissez type sur "mysql" (obligatoire).

  • Définissez credentials sur une chaîne de connexion ADO.NET. Vous pouvez rechercher des chaînes de connexion dans Portail Azure, dans la page Chaînes de connexion pour MySQL.

  • Définissez container sur le nom de la table.

  • Définissez dataChangeDetectionPolicy si les données sont volatiles et que vous voulez que l’indexeur récupère uniquement les éléments nouveaux et mis à jour pendant les exécutions suivantes.

  • Définissez dataDeletionDetectionPolicy si vous voulez supprimer les documents de recherche d’un index de recherche quand l’élément source est supprimé.

Création d'un index

Créer ou mettre à jour un index spécifie le schéma d’index :

{
    "name" : "hotels-mysql-ix",
    "fields": [
        { "name": "ID", "type": "Edm.String", "key": true, "searchable": false },
        { "name": "HotelName", "type": "Edm.String", "searchable": true, "filterable": false },
        { "name": "Category", "type": "Edm.String", "searchable": false, "filterable": true, "sortable": true  },
        { "name": "City", "type": "Edm.String", "searchable": false, "filterable": true, "sortable": true },
        { "name": "Description", "type": "Edm.String", "searchable": false, "filterable": false, "sortable": false  }     
    ]
}

Si la clé primaire de la table source correspond à la clé de document (dans le cas présent, « ID »), l’indexeur importe la clé primaire en tant que clé de document.

Mappage de types de données

Le tableau suivant mappe la base de données MySQL aux équivalents de Azure AI Search. Pour plus d’informations, consultez Types de données pris en charge (Azure AI Search).

Remarque

La préversion ne prend pas en charge les types de géométrie ni les blobs.

Type de données MySQL Types de champs Azure AI Search
bool, boolean Edm.Boolean, Edm.String
tinyint, smallint, mediumint, int, integer, year Edm.Int32, Edm.Int64, Edm.String
bigint Edm.Int64, Edm.String
float, double, real Edm.Double, Edm.String
date, datetime, timestamp Edm.DateTimeOffset, Edm.String
char, varchar, tinytext, mediumtext, text, longtext, enum, set, time Edm.String
données numériques non signées, serial, decimal, dec, bit, blob, binary, geometry N/A

Configurer et exécuter l’indexeur MySQL

Une fois l’index et la source de données créés, vous êtes prêt à créer l’indexeur. La configuration de l’indexeur spécifie les entrées, les paramètres et les propriétés qui contrôlent les comportements d’exécution.

Créez ou mettez à jour un indexeur en lui attribuant un nom, et en référençant la source de données et l’index cible :

{
    "name" : "hotels-mysql-idxr",
    "dataSourceName" : "hotels-mysql-ds",
    "targetIndexName" : "hotels-mysql-ix",
    "disabled": null,
    "schedule": null,
    "parameters": {
        "batchSize": null,
        "maxFailedItems": null,
        "maxFailedItemsPerBatch": null,
        "base64EncodeKeys": null,
        "configuration": { }
        },
    "fieldMappings" : [ ],
    "encryptionKey": null
}

Points essentiels :

Vérifier l’état de l’indexeur

Envoyez une requête Obtenir l’état de l’indexeur pour surveiller l’exécution de l’indexeur :

GET https://myservice.search.windows.net/indexers/myindexer/status?api-version=2023-11-01
  Content-Type: application/json  
  api-key: [admin key]

La réponse comprend l’état et le nombre d’éléments traités. Le résultat doit ressembler à l’exemple suivant :

{
    "status":"running",
    "lastResult": {
        "status":"success",
        "errorMessage":null,
        "startTime":"2024-02-21T00:23:24.957Z",
        "endTime":"2024-02-21T00:36:47.752Z",
        "errors":[],
        "itemsProcessed":1599501,
        "itemsFailed":0,
        "initialTrackingState":null,
        "finalTrackingState":null
    },
    "executionHistory":
    [
        {
            "status":"success",
            "errorMessage":null,
            "startTime":"2024-02-21T00:23:24.957Z",
            "endTime":"2024-02-21T00:36:47.752Z",
            "errors":[],
            "itemsProcessed":1599501,
            "itemsFailed":0,
            "initialTrackingState":null,
            "finalTrackingState":null
        },
        ... earlier history items
    ]
}

L’historique d’exécution contient jusqu’à 50 exécutions les plus récentes, classées par ordre chronologique inversé, la dernière exécution apparaissant en premier.

Indexation des lignes nouvelles et modifiées

Dès qu’un indexeur a entièrement rempli un index de recherche, vous pouvez définir que les exécutions suivantes de l’indexeur indexent de manière incrémentielle uniquement les lignes nouvelles et modifiées dans votre base de données.

Pour activer l’indexation incrémentielle, définissez la propriétédataChangeDetectionPolicy dans la définition de votre source de données. Cette propriété indique à l’indexeur le mécanisme de suivi des changements utilisé sur vos données.

Pour les indexeurs Azure Database pour MySQL, la seule stratégie prise en charge est HighWaterMarkChangeDetectionPolicy.

La stratégie de détection des changements d’un indexeur s’appuie sur une colonne limite supérieure qui capture la version de ligne, ou la date et l’heure de la dernière mise à jour d’une ligne. Il s’agit souvent d’une colonne DATE, DATETIME ou TIMESTAMP avec un niveau de granularité suffisant pour répondre aux exigences d’une colonne de limite supérieure.

Dans votre base de données MySQL, la colonne de limite supérieure doit remplir les exigences suivantes :

  • Toutes les insertions de données doivent spécifier une valeur pour la colonne.
  • Toutes les mises à jour d'un élément modifient également la valeur de la colonne.
  • La valeur de cette colonne augmente à chaque insertion ou mise à jour.
  • Les requêtes utilisant les clauses WHERE et ORDER BY suivantes peuvent être exécutées efficacement : WHERE [High Water Mark Column] > [Current High Water Mark Value] ORDER BY [High Water Mark Column]

L’exemple suivant montre une définition de source de données avec une stratégie de détection des changements :

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

Important

Si vous utilisez une vue, vous devez définir une stratégie de limite supérieure dans la source de données de votre indexeur.

Si la table source n’a pas d’index sur la colonne de limite supérieure, le délai d’attente des requêtes utilisées par l’indexeur MySQL peut expirer. En particulier, la clause ORDER BY [High Water Mark Column] requiert qu’un index s’exécute efficacement lorsque la table contient de nombreuses lignes.

Indexation des lignes supprimées

Quand des lignes sont supprimées de la table ou de la vue, vous devez normalement supprimer également ces lignes de l’index de recherche. Toutefois, si les lignes sont physiquement supprimées de la table, l’indexeur n’a aucun moyen de déduire la présence d’enregistrements qui n’existent plus. La solution est d’utiliser la technique de suppression réversible pour supprimer logiquement les lignes sans les supprimer de la table. Ajoutez une colonne à votre table ou votre vue et marquez les lignes comme supprimées à l’aide de cette colonne.

Avec une colonne qui fournit l’état de suppression, l’indexeur peut être configuré pour supprimer tous les documents de recherche dont l’état de suppression est défini sur true. La propriété de configuration qui prend en charge ce comportement est une stratégie de détection de suppression de données, qui est spécifiée dans la définition de la source de données, de la façon suivante :

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

La softDeleteMarkerValue doit être une chaîne. Par exemple, si vous avez une colonne d’entiers dans laquelle les lignes supprimées sont marquées avec la valeur 1, utilisez "1". Si vous avez une colonne BIT dans laquelle les lignes supprimées sont marquées avec la valeur booléenne True, utilisez le littéral de chaîne True ou true (la casse est sans importance).

Étapes suivantes

Vous pouvez maintenant exécuter l’indexeur, surveiller l’état ou planifier l’exécution de l’indexeur. Les articles suivants s’appliquent aux indexeurs qui tirent du contenu d’Azure MySQL :