Utiliser la recherche de texte intégral sur les fichiers dans Object Storage

Le package PL/SQL DBMS_CLOUD vous permet de créer un index de texte sur les fichiers de la banque d'objets, ce qui vous permet d'effectuer des recherches dans le texte et d'utiliser des caractères génériques lors de la recherche.

A propos de la recherche de texte intégral sur des fichiers dans Object Storage

Vous pouvez créer un index de texte sur les fichiers dans le stockage d'objets. Un index de texte vous permet d'effectuer une recherche basée sur des mots sur des ensembles de données très volumineux dans la banque d'objets.

DBMS_CLOUD fournit des moyens rapides et efficaces de gérer les données dans la banque d'objets. Les API DBMS_CLOUD vous permettent de créer, copier, télécharger, supprimer et parcourir des fichiers présents dans la banque d'objets. Lorsque vous définissez des tables externes, vous pouvez exécuter des requêtes SQL sur les données stockées dans votre banque d'objets (ou avec des tables externes partitionnées hybrides, entre les données de votre base de données et de la banque d'objets). Lorsque vous utilisez DBMS_CLOUD pour définir un index de texte, cela vous permet de rechercher du texte dans vos données et d'utiliser des caractères génériques.

La prise en charge d'Autonomous Database pour la recherche basée sur des mots fonctionne pour les formats de données couramment utilisés, par exemple CSV ou JSON et avec des documents formatés (binaires), par exemple PDF et DOC (MS Word). Vous pouvez configurer une fréquence d'actualisation qui indique la fréquence, en minutes, à laquelle l'index est actualisé pour les nouveaux téléchargements ou suppressions.

Une table locale avec le suffixe standard INDEX_NAME$TXTIDX est créée lorsque vous créez un index sur le stockage d'objet. Vous pouvez utiliser la table pour effectuer une recherche à l'aide du mot-clé CONTAINS.

Pour plus d'informations, reportez-vous à Indexation avec Oracle Text.

Création d'un index de texte sur des fichiers Object Storage

Utilisez DBMS_CLOUD.CREATE_EXTERNAL_TEXT_INDEX pour créer un index de texte sur les fichiers dans le stockage d'objet.

Les documents formatés (binaires) sont pris en charge lorsque vous spécifiez l'option binary_files format avec DBMS_CLOUD.CREATE_EXTERNAL_TEXT_INDEX.

Vous pouvez inclure une liste de mots vides lorsque vous spécifiez l'option stop_words format avec DBMS_CLOUD.CREATE_EXTERNAL_TEXT_INDEX.

Pour plus d'informations sur les mots vides Oracle Text et l'utilisation de fichiers binaires, reportez-vous à Indexation avec Oracle Text.

  1. Créez un objet d'informations d'identification pour accéder à l'emplacement source.

    Pour plus d'informations, reportez-vous à Procédure CREATE_CREDENTIAL.

  2. Exécutez la procédure DBMS_CLOUD.CREATE_EXTERNAL_TEXT_INDEX pour créer un index de texte sur les fichiers de stockage d'objet.
    BEGIN 
    DBMS_CLOUD.CREATE_EXTERNAL_TEXT_INDEX (
            credential_name => 'DEFAULT_CREDENTIAL',
            location_uri    => 'https://objectstorage.us-phoenix-1.oraclecloud.com/n/namespace-string/b/bucketname/o/ts_data/'
            index_name      => 'EMP',
            format          => JSON_OBJECT ('refresh_rate' value 10)
    );
    END;
    /

    Cet exemple crée un index de texte EMP sur les fichiers de stockage d'objet situés à l'URI indiqué dans le paramètre location_uri. L'option refresh_rate dans le paramètre format indique que l'index EMP est actualisé à un intervalle de 10 minutes.

    Cette opération crée une table locale INDEX_NAME$TXTIDX. Vous pouvez utiliser la table INDEX_NAME$TXTIDX pour effectuer une recherche à l'aide de CONTAINS.

    Exemple :

    
     SELECT object_name FROM EMP$TXTIDX
          WHERE CONTAINS(object_name,'king') > 0;
    

    Cette requête renvoie les noms d'objet ou de fichier contenant la chaîne king.

    Pour plus d'informations, reportez-vous à Table de référence des index de texte.

    Vous pouvez interroger une table externe à l'aide de la clause EXTERNAL MODIFY pour extraire les enregistrements réels.

    
    SELECT * FROM EMPEXTTAB EXTERNAL MODIFY ((location_url object_name));
    
    Remarque

    La table externe EMPEXTTAB est un exemple de table externe créée sur le même élément location_url.

    Pour plus d'informations, reportez-vous à Interrogation des données externes avec Autonomous Database.

    Pour plus d'informations, reportez-vous à CREATE_EXTERNAL_TEXT_INDEX Procédure.

    Pour plus d'informations, reportez-vous à Configuration de stratégies et de rôles pour accéder aux ressources.

Suppression d'un index sur les fichiers de stockage cloud

Utilisez la procédure DBMS_CLOUD.DROP_EXTERNAL_TEXT_INDEX pour supprimer un index de texte sur des fichiers de stockage d'objet.

Exécutez la procédure DBMS_CLOUD.DROP_EXTERNAL_TEXT_INDEX pour supprimer un index de texte sur des fichiers dans le stockage d'objets.

BEGIN 
DBMS_CLOUD.DROP_EXTERNAL_TEXT_INDEX (
        index_name => 'EMP',
);
END;
/

Cet exemple supprime l'index de texte EMP.

Pour plus d'informations, reportez-vous à DROP_EXTERNAL_TEXT_INDEX Procédure.

Table de référence d'index de texte

Une table locale est créée dans la base de données avec le suffixe standard INDEX_NAME$TXTIDX. Cette table est créée en interne lorsque vous exécutez DBMS_CLOUD.CREATE_EXTERNAL_TEXT_INDEX.

Vous pouvez interroger la table INDEX_NAME$TXTIDX pour rechercher une chaîne à l'aide du mot-clé CONTAINS. Par exemple, lorsque vous appelez la procédure DBMS_CLOUD.CREATE_EXTERNAL_TEXT_INDEX en tant que EMP, la valeur INDEX_NAME crée la table de référence de texte EMP$TXTIDX.

La table de référence de texte présente les colonnes suivantes :
  • object_name : nom de fichier sur le stockage d'objet qui contient la chaîne de texte recherchée.

  • object_path : est l'URI de dossier ou de bucket de stockage d'objet qui contient le fichier de stockage d'objet.

  • mtime : horodatage de la dernière modification du fichier de stockage d'objet. Il s'agit de l'heure à laquelle le fichier a été consulté pour la dernière fois par DBMS_CLOUD.

Exemple :
SELECT object_path, object_name FROM EMP$TXTIDX WHERE CONTAINS(OBJECT_NAME, 'king') > 0;
 
OBJECT_PATH                                                                                      OBJECT_NAME
------------------------------------------------------------------------------------------      ------------------------------------
https://objectstorage.us-phoenix-1.oraclecloud.com/n/example1/b/adbs_data_share/o/ts_data/       data_2_20221026T195313585601Z.json

Cette requête renvoie les noms de fichier et l'URI d'emplacement sur le stockage d'objet qui contient la chaîne de texte king, en majuscules ou en minuscules.

SELECT object_name, mtime FROM EMP$TXTIDX;
 
OBJECT_NAME                     MTIME
----------------------------- -------------------------------------
data_1_20220531T165402Z.json    31-MAY-22 04.54.02.979000 PM +00:00
data_1_20220531T165427Z.json    31-MAY-22 04.54.27.997000 PM +00:00

Cette requête renvoie le nom de fichier et l'horodatage de la dernière modification des fichiers d'objet sur lesquels l'index EMP est créé.

Surveiller la création d'index de texte

Lorsque vous exécutez DBMS_CLOUD.CREATE_EXTERNAL_TEXT_INDEX, l'opération de création d'index de texte est journalisée dans la vue ALL_SCHEDULER_JOB_RUN_DETAILS.

Vous pouvez interroger la vue ALL_SCHEDULER_JOB_RUN_DETAILS pour obtenir le statut et toute erreur signalée par le travail de création d'index.

Le nom du travail DBMS_SCHEDULER est dérivé du paramètre INDEX_NAME indiqué lors de l'appel de DBMS_CLOUD.CREATE_EXTERNAL_TEXT_INDEX.

Pour interroger la vue ALL_SCHEDULER_JOB_RUN_DETAILS, vous devez être connecté en tant qu'utilisateur ADMIN ou disposer du privilège READ sur la vue ALL_SCHEDULER_JOB_RUN_DETAILS.

Par exemple, l'instruction SELECT suivante avec une clause WHERE sur job_name affiche les détails d'exécution du travail :

SELECT status, additional_info 
   FROM all_scheduler_job_run_details WHERE LOWER(job_name) = LOWER('index_name$JOB');

Vous pouvez également rechercher l'existence d'un travail de planificateur de création d'index.

Exemple :
SELECT status 
    FROM all_scheduler_jobs where LOWER(job_name) = LOWER('index_name$JOB');

Pour plus d'informations, reportez-vous à CREATE_EXTERNAL_TEXT_INDEX Procédure.