IBM Cloud Docs
Vue d'ensemble de DQL

Vue d'ensemble de DQL

Le Discovery langage de requête définit la syntaxe que vous pouvez utiliser pour filtrer, rechercher et analyser vos données.

Comment écrire une Discovery Requête en langage de requête

Le Discovery langage d'interrogation exploite la structure des documents indexés. L'extrait JSON suivant montre un document indexé d'une collection où l'enrichissement Entités est appliqué. Grâce à l'enrichissement, la structure JSON contient toutes les mentions d'entités connues, telles que des noms de villes, d'entreprises ou de personnes célèbres.

Dans cet exemple, l'entité reconnue est le nom de l'entreprise IBM.

{
  "document": {
    "document_id": "f7f27ea30eb3e4c0ce21830618d9ee99",
    "enriched_text": [
      {
        "entities": [
          {
            "model_name": "natural_language_understanding",
            "mentions": [],
            "text":"IBM",
            "type":"Organization"
          }
        ]
      }
    ]
  }
}

Pour créer une requête qui renvoie tous les documents dans lesquels l'entité IBM est mentionnée, utilisez la syntaxe suivante :

La structure de la requête enriched_text.entities.text:IBM, où le texte dans enriched_text est le champ où l'enrichissement est appliqué, et IBM est le terme que vous recherchez dans le sous-champ enriched_text.entities.text.
Example query structure

Cette requête de base contient une expression de chemin d'accès imbriquée avant l'opérateur :. Chaque élément du chemin est le nom d'un champ du document, séparé par un point (.). L'opérateur : indique que le texte qui suit l'opérateur doit être inclus dans le résultat.

L'opérateur :: indique que le texte doit correspondre exactement au résultat. Pour plus d'informations, voir Opérateurs de requête. Vous pouvez voir comment les deux opérateurs sont utilisés dans les exemples suivants.

  • Pour renvoyer les documents correspondants par ordre de pertinence, transmettez l'objet de données suivant dans la requête POST :

    {
      "query":"enriched_text.entities.text:IBM"
    }
    
  • Pour renvoyer les documents correspondants dans n'importe quel ordre, transmettez l'objet de données suivant dans la requête POST en tant que corps de la requête :

    {
      "filter":"enriched_text.entities.text::IBM"
    }
    

Utilisation conjointe des paramètres de filtre et de requête

Le paramètre filter renvoie plus rapidement que le paramètre query et ses résultats sont mis en cache. Si vous soumettez des requêtes utilisant les paramètres filter et query séparément sur un petit ensemble de données, chaque requête renvoie des résultats similaires (voire identiques).

Dans les grands ensembles de données, si vous souhaitez que les résultats soient renvoyés par ordre de pertinence, combinez les paramètres filter et query. L'utilisation conjointe des paramètres améliore les performances car le paramètre filter est appliqué en premier. Il filtre les documents et met en cache les résultats. Le paramètre query classe ensuite les résultats mis en cache.

Exemple de filtre : Obtenir un document par son ID

Corps de la requête :

{
  "filter": "document_id::b6d8c6e3-1097-421b-9e39-75717d2554aa"
}

Si le document existe, la requête renvoie 1 résultat correspondant. Dans le cas contraire, la requête ne renvoie aucun résultat correspondant.

Exemple de filtre : Recherche d'un identifiant de document par son nom de fichier

Si vous ne connaissez pas le document_id d'un document, mais que vous connaissez le filename original du document, vous pouvez utiliser les paramètres filter et return ensemble pour découvrir le document_id.

Corps de la requête :

{
  "filter": "extracted_metadata.filename::100674.txt",
  "return": [ "document_id", "extracted_metadata" ]
}

Réponse :

{
  "matching_results": 1,
  "results": [
    {
      "document_id": "b6d8c6e3-1097-421b-9e39-75717d2554aa",
      "extracted_metadata": {
        "sha1": "AD447F7592A17CDCBF0A589C4E6EC2087AF7H35F",
        "filename": "100674.txt",
        "file_type": "text"
      }
    }
  ]
}

Exemple de filtre : Trouver les documents qui mentionnent une valeur d'entité

La requête recherche les documents qui mentionnent l'entité Gilroy et trouve 4 documents correspondants.

Corps de la requête :

{
  "filter": "enriched_text.entities.text::Gilroy"
}

Réponse :

{
  "matching_results": 4
}

Filtrer les valeurs imbriquées

Vous pouvez imbriquer un filtre dans un autre pour vous assurer que les documents renvoyés répondent à plusieurs conditions.

Dans les documents utilisés pour ces exemples, l'entité "Gilroy" apparaît à la fois comme un type d'entité "Location" (une ville en Californie) et comme un type d'entité "Person" (un nom de famille). Pour trouver les documents où "Gilroy" apparaît comme emplacement, écrivez une requête qui filtre sur deux champs imbriqués en même temps : le texte de l'entité doit être "Gilroy" et le type d'entité doit être "Location".

La requête peut être rédigée de la manière suivante :

{
  "filter": "enriched_text.entities.text::Gilroy,enriched_text.entities.type::Location"
}

Cette requête correspond aux documents dont un chemin enriched_text.entities.text est Gilroy et un chemin enriched_text.entities.type::Location est Location. Cependant, rien ne garantit que ces deux chemins se trouvent sous le même objet entities. Par exemple, la requête correspond aux documents qui ont Gilroy comme type d'entité Person et qui, en même temps, ont un autre objet de type d'entité Location.

Pour capturer avec précision la sémantique imbriquée de cette requête, imbriquez les valeurs du filtre en utilisant la syntaxe suivante :

Corps de la requête :

{
  "filter": "enriched_text.entities:(text::Gilroy,type::Location)"
}

Cette requête plus stricte ne correspond qu'aux documents contenant un objet entities avec text égal à Gilroy et type égal à Location.

Autre exemple, si vous voulez faire correspondre des documents qui contiennent un objet entities avec text égal à Gilroy mais type not égal à Location, vous pouvez utiliser l'opérateur non égal dans la requête, par exemple :

{
  "filter": "enriched_text.entities:(text::Gilroy,type::!Location)"
}

Vous pouvez également utiliser des agrégations pour effectuer un filtrage plus sophistiqué des résultats. Pour plus d'informations sur les types d'agrégations disponibles, voir Agrégations de requêtes.

Pour plus d'informations sur le langage de requête Discovery, voir les rubriques suivantes :