Articles

Elasticsearch – Query DSL

Advertisements

In Elasticsearch, la ricerca viene effettuata utilizzando una query basata su JSON. Una query è composta da due clausole –

  • Clausole di query a foglia – Queste clausole sono match, term o range, che cercano un valore specifico in un campo specifico.

  • Clausole di query composte – Queste query sono una combinazione di clausole di query a foglia e altre query composte per estrarre le informazioni desiderate.

Elasticsearch supporta un gran numero di query. Una query inizia con una parola chiave di query e poi ha condizioni e filtri all’interno sotto forma di oggetto JSON. I diversi tipi di query sono stati descritti di seguito.

Match All Query

Questa è la query più semplice; restituisce tutto il contenuto e con il punteggio di 1.0 per ogni oggetto.

POST /schools/_search{ "query":{ "match_all":{} }}

Eseguendo il codice di cui sopra, otteniamo il seguente risultato –

{ "took" : 7, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 2, "relation" : "eq" }, "max_score" : 1.0, "hits" : , "fees" : 2200, "tags" : , "rating" : "3.3" } }, { "_index" : "schools", "_type" : "school", "_id" : "4", "_score" : 1.0, "_source" : { "name" : "City Best School", "description" : "ICSE", "street" : "West End", "city" : "Meerut", "state" : "UP", "zip" : "250002", "location" : , "fees" : 3500, "tags" : , "rating" : "4.5" } } ] }}

Query a testo completo

Queste query sono usate per cercare un corpo intero di testo come un capitolo o un articolo di giornale. Questa query funziona secondo l’analizzatore associato a quel particolare indice o documento. In questa sezione, discuteremo i diversi tipi di query a testo completo.

Query di corrispondenza

Questa query corrisponde a un testo o a una frase con i valori di uno o più campi.

POST /schools*/_search{ "query":{ "match" : { "rating":"4.5" } }}

Eseguendo il codice di cui sopra, otteniamo la risposta come mostrato di seguito –

{ "took" : 44, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 1, "relation" : "eq" }, "max_score" : 0.47000363, "hits" : , "fees" : 3500, "tags" : , "rating" : "4.5" } } ] }}

Multi Match Query

Questa query corrisponde a un testo o una frase con più di un campo.

POST /schools*/_search{ "query":{ "multi_match" : { "query": "paprola", "fields": } }}

Eseguendo il codice di cui sopra, otteniamo la risposta come mostrato qui sotto –

{ "took" : 12, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 1, "relation" : "eq" }, "max_score" : 0.9808292, "hits" : , "fees" : 2200, "tags" : , "rating" : "3.3" } } ] }}

Query String Query

Questa query usa il parser di query e la parola chiave query_string.

POST /schools*/_search{ "query":{ "query_string":{ "query":"beautiful" } }} 

Eseguendo il codice di cui sopra, otteniamo la risposta come mostrato di seguito –

{ "took" : 60, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 1, "relation" : "eq" },………………………………….

Query a livello di termine

Queste query trattano principalmente dati strutturati come numeri, date ed enum.

POST /schools*/_search{ "query":{ "term":{"zip":"176115"} }}

Eseguendo il codice di cui sopra, otteniamo la risposta come mostrato di seguito –

……………………………..hits" : , } }] …………………………………………..

Range Query

Questa query è usata per trovare gli oggetti che hanno valori compresi tra gli intervalli di valori indicati. Per questo, abbiamo bisogno di usare operatori come –

  • gte – maggiore di uguale a
  • gt – maggiore di
  • lte – minore di uguale a
  • lt – minore di

Per esempio, osservare il codice riportato di seguito –

POST /schools*/_search{ "query":{ "range":{ "rating":{ "gte":3.5 } } }}

Eseguendo il codice di cui sopra, otteniamo la risposta come mostrato di seguito –

{ "took" : 24, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 1, "relation" : "eq" }, "max_score" : 1.0, "hits" : , "fees" : 3500, "tags" : , "rating" : "4.5" } } ] }}

Esistono anche altri tipi di query a livello di termine come –

  • Exists query – Se un certo campo ha valore non nullo.

  • Quota mancante – Questo è completamente opposto alla query esiste, questa query cerca oggetti senza campi specifici o campi con valore nullo.

  • Query jolly o regexp – Questa query usa espressioni regolari per trovare schemi negli oggetti.

Query composte

Queste query sono un insieme di diverse query fuse tra loro usando operatori booleani come and, or, not or per indici diversi o con chiamate a funzioni ecc.

POST /schools/_search{ "query": { "bool" : { "must" : { "term" : { "state" : "UP" } }, "filter": { "term" : { "fees" : "2200" } }, "minimum_should_match" : 1, "boost" : 1.0 } }}

Eseguendo il codice di cui sopra, otteniamo la risposta come mostrato di seguito –

{ "took" : 6, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 0, "relation" : "eq" }, "max_score" : null, "hits" : }}

Geo Queries

Queste query hanno a che fare con posizioni e punti geografici. Queste query aiutano a trovare le scuole o qualsiasi altro oggetto geografico vicino a qualsiasi luogo. È necessario utilizzare il tipo di dati geo point.

PUT /geo_example{ "mappings": { "properties": { "location": { "type": "geo_shape" } } }}

Eseguendo il codice di cui sopra, otteniamo la risposta come mostrato di seguito –

{ "acknowledged" : true, "shards_acknowledged" : true, "index" : "geo_example"}

Ora pubblichiamo i dati nell’indice creato sopra.

POST /geo_example/_doc?refresh{ "name": "Chapter One, London, UK", "location": { "type": "point", "coordinates": }}

Eseguendo il codice di cui sopra, otteniamo la risposta come mostrato di seguito –

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *