Articles

Elasticsearch – Query DSL

Advertenties

In Elasticsearch wordt gezocht door gebruik te maken van query’s op basis van JSON. Een query bestaat uit twee clausules –

  • Leaf Query Clauses – Deze clausules zijn match, term of range, die zoeken naar een specifieke waarde in een specifiek veld.

  • Compound Query Clauses – Deze query’s zijn een combinatie van leaf query clausules en andere samengestelde query’s om de gewenste informatie te extraheren.

Elasticsearch ondersteunt een groot aantal query’s. Een query begint met een query-sleutelwoord en bevat vervolgens voorwaarden en filters in de vorm van een JSON-object. De verschillende typen queries zijn hieronder beschreven.

Match All Query

Dit is de meest basale query; het geeft alle inhoud terug en met de score van 1.0 voor elk object.

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

Bij het uitvoeren van bovenstaande code krijgen we het volgende resultaat –

{ "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" } } ] }}

Volledige tekst query

Deze query’s worden gebruikt om een volledige body of text te doorzoeken, zoals een hoofdstuk of een nieuwsartikel. Deze query’s werken volgens de analysator die bij die bepaalde index of dat document hoort. In deze paragraaf bespreken we de verschillende soorten volledige tekst queries.

Match query

Deze query matcht een tekst of zinsdeel met de waarden van een of meer velden.

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

Op het uitvoeren van de bovenstaande code, krijgen we het antwoord zoals hieronder getoond –

{ "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

Deze query matcht een tekst of zinsdeel met meer dan één veld.

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

Bij het uitvoeren van bovenstaande code, krijgen we het antwoord zoals hieronder getoond –

{ "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

Deze query gebruikt query parser en query_string keyword.

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

Als we bovenstaande code uitvoeren, krijgen we het antwoord zoals hieronder getoond –

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

Query’s op termniveau

Deze query’s gaan voornamelijk over gestructureerde gegevens zoals getallen, data en enums.

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

Als we bovenstaande code uitvoeren, krijgen we het antwoord zoals hieronder getoond –

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

Range Query

Deze query wordt gebruikt om de objecten te vinden die waarden hebben tussen de opgegeven bereiken van waarden. Hiervoor moeten we operatoren gebruiken zoals –

  • gte – groter dan gelijk aan
  • gt – groter dan
  • lte – minder-dan-gelijk aan
  • lt – minder-dan

Voorbeeld, zie de onderstaande code –

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

Als we bovenstaande code uitvoeren, krijgen we het antwoord dat hieronder wordt weergegeven –

{ "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" } } ] }}

Er bestaan ook andere soorten query’s op termniveau, zoals –

  • Exists query – Als een bepaald veld een waarde heeft die niet null is.

  • Verbreekt query – Dit is compleet tegenovergesteld aan de bestaat query, in deze query wordt gezocht naar objecten zonder specifieke velden of velden met een null-waarde.

  • Wildcard- of regexp-query – Bij deze query worden reguliere expressies gebruikt om patronen in de objecten te vinden.

Samengestelde query’s

Deze query’s zijn een verzameling van verschillende query’s die met elkaar zijn samengevoegd door gebruik te maken van Booleaanse operatoren zoals en, of, niet of voor verschillende indexen of met functieaanroepen enzovoort.

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

Als we bovenstaande code uitvoeren, krijgen we het antwoord zoals hieronder getoond –

{ "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

Deze queries gaan over geo-locaties en geo-punten. Deze query’s helpen bij het vinden van scholen of andere geografische objecten in de buurt van een locatie. U moet het gegevenstype geopunt gebruiken.

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

Bij het uitvoeren van de bovenstaande code krijgen we het antwoord zoals hieronder weergegeven –

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

Nu plaatsen we de gegevens in de index die hierboven is gemaakt.

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

Bij het uitvoeren van de bovenstaande code, krijgen we de reactie zoals hieronder getoond –

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *