Elasticsearch SQL Translate API

Elasticsearch Sql Translate Api



I det här inlägget kommer vi att lära oss hur man översätter en SQL-sökning till en giltig Elasticsearch sök API-begäran som innehåller fullständigt Query Domain Specific Language baserat på JSON.

Även om detta är ett litet API, är det ett mycket fördelaktigt verktyg, särskilt för utvecklare som kommer från SQL-databaser. Det kan också minska inlärningskurvan genom att snabbt relatera SQL-frågorna till motsvarande sökfrågor.

Du kan sedan utforska alla funktioner i Elasticsearch sök-API och de frågespråk som stöds.







Det är att komma ihåg att även om Elasticsearch stöder SQL, innehåller det olika begränsningar.



Frågesyntax

Följande visar syntaxen för translate API:



GET _sql/translate

{

request_body

}

Du kan också skicka en inläggsbegäran till översättnings-API:t som visas i följande syntax:





POST _sql/translate

{

request_body

}

Beroende på din klusterkonfiguration kan API:et kräva läsbehörighet för indexet vars data du vill fråga. Du kan också ange målresursen som ett indexalias eller en dataström.

I request_body kan du ange alla parametrar för SQL Search API-förfrågan body. Utforska dokumenten i följande resurs för att lära dig mer:



https://www.elastic.co/guide/en/elasticsearch/reference/current/sql-search-api.html#sql-search-api-request-body

Som ett svar bör frågan returnera resultatet som motsvarar sök-API:et med den efterfrågade informationen.

Exempel

För att bäst illustrera hur man använder detta API kommer vi att anta att vi har ett index som heter 'netflix' som innehåller all data om Netflix-filmer och TV-program.

Anta att vi vill hämta de fem bästa filmerna från Netflix-indexet som vi släppte år 2020 och uppåt:

Den motsvarande SQL-frågan kan uttryckas enligt nedan:

VÄLJ titel, varaktighet, betyg, typ FRÅN netflix WHERE typ = 'Film' OCH release_year >= 2020

För att utföra ovanstående SQL-sökning i Elasticsearch kan vi lägga in den i SQL Search API som visas nedan:

curl -XGET 'http://localhost:9200/_sql?format=txt' -H 'kbn-xsrf: rapportering' -H 'Content-Type: application/json' -d '

{

'query': ' \n VÄLJ titel, varaktighet, betyg, skriv FRÅN 'netflix' WHERE typ = '
\ '' Film ' \' ' OCH release_year >= 2020 \n ',

'
hämta_storlek ': 5

}'

Den tidigare begäran bör fråga efter indexet och hämta de matchande posterna. Returutdata är i textformat enligt nedan:

Som vi kan se returnerar Elasticsearch den förväntade utdata.

För att returnera utdata som JSON kan vi ställa in formatet till JSON som visas nedan:

curl -XGET 'http://localhost:9200/_sql?format=json' -H 'kbn-xsrf: rapportering' -H 'Content-Type: application/json' -d '

{

'query': ' \n VÄLJ titel, varaktighet, betyg, skriv FRÅN 'netflix' WHERE typ = '
\ '' Film ' \' ' OCH release_year >= 2020 \n ',

'
hämta_storlek ': 5

}'

Produktion:

Konvertera SQL-fråga till sökförfrågan

För att konvertera den tidigare SQL-sökfrågan till en Elasticsearch-begäran kan vi skicka den till översättnings-API:et enligt nedan:

curl -XGET 'http://localhost:9200/_sql/translate' -H 'kbn-xsrf: rapportering' -H 'Content-Type: application/json' -d '

{

'query': ' \n VÄLJ titel, varaktighet, betyg, skriv FRÅN 'netflix' WHERE typ = '
\ '' Film ' \' ' OCH release_year >= 2020 \n ',

'
hämta_storlek ': 5

}'

API:t bör analysera SQL-inmatningen och konvertera den till en giltig sökbegäran, som visas i följande utdata:

{
'storlek' : 5 ,
'fråga' : {
'bool' : {
'måste' : [
{
'termin' : {
'typ' : {
'värde' : 'Film'
}
}
},
{
'räckvidd' : {
'utgivningsår' : {
'gte' : 2020 ,
'lyft' : 1
}
}
}
],
'lyft' : 1
}
},
'_källa' : falskt,
'fält' : [
{
'fält' : 'titel'
},
{
'fält' : 'varaktighet'
},
{
'fält' : 'betyg'
},
{
'fält' : 'typ'
}
],
'sortera' : [
{
'_doc' : {
'ordning' : 'asc'
}
}
]
}

Du kan sedan använda det här förfrågningsformatet för att skicka till Elasticsearch sök-API som visas nedan:

curl -XPOST 'http://localhost:9200/netflix/_search' -H 'kbn-xsrf: rapportering' -H 'Content-Type: application/json' -d '
{
'storlek': 5,
'query': {
'bool': {
'måste': [
{
'termin': {
'typ': {
'value': 'Film'
}
}
},
{
'range': {
'utgivningsår': {
'gte': 2020,
'boost': 1
}
}
}
],
'boost': 1
}
},
'_source': false,
'fält': [
{
'field': 'titel'
},
{
'field': 'varaktighet'
},
{
'field': 'betyg'
},
{
'field': 'typ'
}
],
'sortera': [
{
'_doc': {
'order': 'asc'
}
}
]
}'

På samma sätt bör begäran returnera liknande data som visas nedan:

Slutsats

Genom det här inlägget upptäckte du hur du kan använda SQL-frågor för att hämta data från ett befintligt Elasticsearch-index. Du lärde dig också hur du använder översätt SQL API för att konvertera en giltig SQL-fråga till en Elasticsearch-förfrågan.