Panoramica del DQL
Il Discovery Query Language definisce la sintassi da usare per filtrare, cercare e analizzare i dati.
Come scrivere una query Discovery Query Language
Il Discovery Query Language sfrutta la struttura dei documenti indicizzati. Il seguente frammento JSON mostra un documento indicizzato di una raccolta a cui è stato applicato l'arricchimento Entità. Come risultato dell'arricchimento, la struttura JSON cattura qualsiasi menzione di entità note, come nomi di città, aziende o personaggi famosi.
In questo esempio, l'entità riconosciuta è il nome della società IBM.
{
"document": {
"document_id": "f7f27ea30eb3e4c0ce21830618d9ee99",
"enriched_text": [
{
"entities": [
{
"model_name": "natural_language_understanding",
"mentions": [],
"text":"IBM",
"type":"Organization"
}
]
}
]
}
}
Per creare una query che restituisca tutti i documenti in cui è menzionata l'entità IBM, utilizzare la seguente sintassi:
Questa query di base contiene un'espressione di percorso annidata prima dell'operatore :. Ogni elemento di percorso è il nome di un campo del documento separato da un punto (.). L'operatore : indica che
il testo che segue l'operatore deve essere incluso nel risultato.
L'operatore :: indica che il testo deve corrispondere esattamente al risultato. Per ulteriori informazioni, vedere Gli operatori di query. Negli esempi seguenti
si può vedere come vengono utilizzati i due operatori.
-
Per restituire i documenti corrispondenti in ordine di rilevanza, passare il seguente oggetto dati nella richiesta
POST:{ "query":"enriched_text.entities.text:IBM" } -
Per restituire i documenti corrispondenti in qualsiasi ordine, passare il seguente oggetto dati nella richiesta
POSTcome corpo della query:{ "filter":"enriched_text.entities.text::IBM" }
Utilizzo dei parametri del filtro e della query insieme
Il parametro filter restituisce più velocemente del parametro query e i suoi risultati sono memorizzati nella cache. Se si inviano query che utilizzano i parametri filter e query separatamente
su un piccolo insieme di dati, ogni richiesta restituisce risultati simili (se non identici).
In grandi insiemi di dati, se si desidera che i risultati vengano restituiti in ordine di rilevanza, combinare i parametri filter e query. L'uso congiunto dei parametri migliora le prestazioni, perché il parametro filter viene applicato per primo. Filtra i documenti e memorizza i risultati. Il parametro query classifica i risultati nella cache.
Esempio di filtro: Ottenere un documento in base al suo ID
Corpo della domanda:
{
"filter": "document_id::b6d8c6e3-1097-421b-9e39-75717d2554aa"
}
Se il documento esiste, la query restituisce 1 risultato corrispondente. In caso contrario, la query non restituisce alcun risultato corrispondente.
Esempio di filtro: Trovare l'ID di un documento in base al nome del file
Se non si conosce il document_id di un documento, ma si conosce il filename originale del documento, si possono usare i parametri filter e return insieme per scoprire il document_id.
Corpo della domanda:
{
"filter": "extracted_metadata.filename::100674.txt",
"return": [ "document_id", "extracted_metadata" ]
}
Risposta:
{
"matching_results": 1,
"results": [
{
"document_id": "b6d8c6e3-1097-421b-9e39-75717d2554aa",
"extracted_metadata": {
"sha1": "AD447F7592A17CDCBF0A589C4E6EC2087AF7H35F",
"filename": "100674.txt",
"file_type": "text"
}
}
]
}
Esempio di filtro: Trova i documenti che menzionano un valore di entità
La query cerca i documenti che menzionano l'entità Gilroy e trova 4 documenti corrispondenti.
Corpo della domanda:
{
"filter": "enriched_text.entities.text::Gilroy"
}
Risposta:
{
"matching_results": 4
}
Filtrare i valori annidati
È possibile annidare un filtro all'interno di un altro per garantire che i documenti restituiti corrispondano a più di una condizione.
Nei documenti utilizzati per questi esempi, l'entità "Gilroy" appare sia come tipo di entità "Location" (una città della California) sia come tipo di entità "Person" (un cognome).
Per trovare i documenti in cui "Gilroy" compare come località, scrivere una query che filtri contemporaneamente su due campi annidati: il testo dell'entità deve essere "Gilroy" e il tipo di entità
deve essere "Location".
Un modo per scrivere la query è il seguente:
{
"filter": "enriched_text.entities.text::Gilroy,enriched_text.entities.type::Location"
}
Questa query corrisponde a documenti in cui un percorso enriched_text.entities.text è Gilroy e un percorso enriched_text.entities.type::Location è Location. Tuttavia, non è garantito che questi
due percorsi siano sotto lo stesso oggetto entities. Ad esempio, la query corrisponde a documenti che hanno Gilroy come tipo di entità Person e, allo stesso tempo, hanno qualche altro oggetto di tipo
entità Location.
Per catturare accuratamente la semantica annidata di questa query, annidare i valori dei filtri utilizzando la seguente sintassi:
Corpo della domanda:
{
"filter": "enriched_text.entities:(text::Gilroy,type::Location)"
}
Questa query più rigida corrisponde solo ai documenti in cui esiste un oggetto entities con text uguale a Gilroy e type uguale a Location.
Come altro esempio, se si desidera abbinare documenti che contengono un oggetto entities con text uguale a Gilroy ma type non uguale a Location, si può usare l'operatore
non uguale nella query, ad esempio:
{
"filter": "enriched_text.entities:(text::Gilroy,type::!Location)"
}
È inoltre possibile utilizzare le aggregazioni per effettuare un filtraggio più sofisticato dei risultati. Per ulteriori informazioni sui tipi di aggregazione disponibili, vedere Aggregazioni di query.
Per ulteriori informazioni su Discovery Query Language, vedere i seguenti argomenti: