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:

La struttura della query enriched_text.entities.text:IBM, dove il testo in enriched_text è il campo in cui viene applicato l'arricchimento e IBM è il termine che si sta cercando nel sottocampo enriched_text.entities.text.
Example query structure

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 POST come 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: