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 :

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 :