Elasticsearch SQL Translate API

Elasticsearch Sql Translate Api



I dette indlæg lærer vi, hvordan man oversætter en SQL-søgning til en gyldig Elasticsearch-søgnings-API-anmodning, der indeholder fuld Query Domain Specific Language baseret på JSON.

Selvom dette er en lille API, er det et meget gavnligt værktøj, især for udviklere, der kommer fra SQL-databaser. Det kan også reducere indlæringskurven ved hurtigt at relatere SQL-forespørgslerne til de tilsvarende søgeforespørgsler.

Du kan derefter udforske de fulde muligheder i Elasticsearch søge-API'en og de understøttede forespørgselssprog.







Det er at huske på, at selvom Elasticsearch understøtter SQL, indeholder det forskellige begrænsninger.



Forespørgselssyntaks

Det følgende viser syntaksen for oversættelses-API'en:



GET _sql/translate

{

request_body

}

Du kan også sende en postanmodning til oversættelses-API'en som vist i følgende syntaks:





POST _sql/translate

{

request_body

}

Afhængigt af din klyngekonfiguration kan API'en kræve læserettigheder på det indeks, hvis data du ønsker at forespørge på. Du kan også angive målressourcen som et indeksalias eller en datastrøm.

I request_body kan du angive alle SQL Search API request body parametre. Udforsk dokumenterne i følgende ressource for at lære mere:



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

Som et svar skal forespørgslen returnere det resultat, der svarer til søge-API'en med de forespurgte data.

Eksempel

For bedst at illustrere, hvordan man bruger denne API, vil vi antage, at vi har et indeks kaldet 'netflix', der indeholder alle data om Netflix-film og tv-shows.

Antag, at vi ønsker at hente de fem bedste film fra Netflix-indekset, som vi udgav i år 2020 og derover:

Den tilsvarende SQL-forespørgsel kan udtrykkes som vist nedenfor:

VÆLG titel, varighed, vurdering, skriv FRA netflix WHERE type = 'Film' OG udgivelsesår >= 2020

For at udføre ovenstående SQL-søgning i Elasticsearch kan vi sætte den ind i SQL Search API som vist nedenfor:

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

{

'query': ' \n VÆLG titel, varighed, vurdering, skriv FRA 'netflix' WHERE type = '
\ '' Film ' \' ' OG udgivelsesår >= 2020 \n ',

'
hente_størrelse ': 5

}'

Den tidligere anmodning skulle forespørge indekset og hente de matchende poster. Returoutputtet er i tekstformat som angivet nedenfor:

Som vi kan se, returnerer Elasticsearch det forventede output.

For at returnere output som JSON, kan vi indstille formatet til JSON som vist nedenfor:

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

{

'query': ' \n VÆLG titel, varighed, vurdering, skriv FRA 'netflix' WHERE type = '
\ '' Film ' \' ' OG udgivelsesår >= 2020 \n ',

'
hente_størrelse ': 5

}'

Produktion:

Konverter SQL-forespørgsel til søgeanmodning

For at konvertere den tidligere SQL-søgeforespørgsel til en Elasticsearch-anmodning kan vi overføre den til oversættelses-API'en som vist nedenfor:

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

{

'query': ' \n VÆLG titel, varighed, vurdering, skriv FRA 'netflix' WHERE type = '
\ '' Film ' \' ' OG udgivelsesår >= 2020 \n ',

'
hente_størrelse ': 5

}'

API'et skal parse input SQL input og konvertere det til en gyldig søgeanmodning, som vist i følgende output:

{
'størrelse' : 5 ,
'forespørgsel' : {
'bool' : {
'skal' : [
{
'semester' : {
'type' : {
'værdi' : 'Film'
}
}
},
{
'rækkevidde' : {
'udgivelsesår' : {
'gte' : 2020 ,
'boost' : 1
}
}
}
],
'boost' : 1
}
},
'_kilde' : falsk,
'felter' : [
{
'Mark' : 'titel'
},
{
'Mark' : 'varighed'
},
{
'Mark' : 'bedømmelse'
},
{
'Mark' : 'type'
}
],
'sortere' : [
{
'_doc' : {
'bestille' : 'asc'
}
}
]
}

Du kan derefter bruge dette anmodningsformat til at sende til Elasticsearch søge-API'en som vist nedenfor:

krølle -XPOST 'http://localhost:9200/netflix/_search' -H 'kbn-xsrf: rapportering' -H 'Content-Type: application/json' -d '
{
'størrelse': 5,
'forespørgsel': {
'bool': {
'skal': [
{
'term': {
'type': {
'value': 'Film'
}
}
},
{
'rækkevidde': {
'release_year': {
'gte': 2020,
'boost': 1
}
}
}
],
'boost': 1
}
},
'_source': falsk,
'felter': [
{
'field': 'title'
},
{
'field': 'varighed'
},
{
'field': 'rating'
},
{
'field': 'type'
}
],
'sortere': [
{
'_doc': {
'ordre': 'asc'
}
}
]
}'

På samme måde skal anmodningen returnere lignende data som vist nedenfor:

Konklusion

Gennem dette indlæg opdagede du, hvordan du kunne bruge SQL-forespørgsler til at hente data fra et eksisterende Elasticsearch-indeks. Du lærte også, hvordan du bruger oversætte SQL API til at konvertere en gyldig SQL-forespørgsel til en Elasticsearch-anmodning.