Elasticsearch SQL Translate API

Elasticsearch Sql Translate Api



I dette innlegget vil vi lære hvordan du oversetter et SQL-søk til en gyldig Elasticsearch-søke-API-forespørsel som inneholder fullstendig Query Domain Specific Language basert på JSON.

Selv om dette er et lite API, er det et veldig nyttig verktøy, spesielt for utviklere som kommer fra SQL-databaser. Det kan også redusere læringskurven ved raskt å relatere SQL-spørringene til de tilsvarende søkene.

Du kan deretter utforske alle funksjonene til Elasticsearch søke-API og de støttede søkespråkene.







Det er å huske på at selv om Elasticsearch støtter SQL, inneholder det forskjellige begrensninger.



Spørringssyntaks

Følgende viser syntaksen til translate API:



GET _sql/translate

{

request_body

}

Du kan også sende en postforespørsel til translate API som vist i følgende syntaks:





POST _sql/translate

{

request_body

}

Avhengig av klyngekonfigurasjonen din, kan API-en kreve leserettigheter på indeksen hvis data du ønsker å spørre etter. Du kan også spesifisere målressursen som et indeksalias eller en datastrøm.

I request_body kan du spesifisere alle SQL Search API request body parametere. Utforsk dokumentene i følgende ressurs for å finne ut mer:



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

Som et svar skal spørringen returnere resultatet som tilsvarer søke-APIet med de forespurte dataene.

Eksempel

For best å illustrere hvordan du bruker denne API-en, vil vi anta at vi har en indeks kalt 'netflix' som inneholder all data om Netflix-filmer og TV-serier.

Anta at vi ønsker å hente de fem beste filmene fra Netflix-indeksen som vi ga ut i 2020 og oppover:

Den tilsvarende SQL-spørringen kan uttrykkes som vist nedenfor:

VELG tittel, varighet, vurdering, type FROM netflix WHERE type = 'Film' OG utgivelsesår >= 2020

For å utføre SQL-søket ovenfor i Elasticsearch, kan vi sette det inn 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 VELG tittel, varighet, vurdering, skriv FRA 'netflix' WHERE type = '
\ '' Film ' \' ' OG utgivelsesår >= 2020 \n ',

'
hente_størrelse ': 5

}'

Den forrige forespørselen skulle spørre indeksen og hente de samsvarende postene. Returutgangen er i tekstformat som vist nedenfor:

Som vi kan se, returnerer Elasticsearch den forventede utgangen.

For å returnere utdataene som JSON, kan vi sette 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 VELG tittel, varighet, vurdering, skriv FRA 'netflix' WHERE type = '
\ '' Film ' \' ' OG utgivelsesår >= 2020 \n ',

'
hente_størrelse ': 5

}'

Produksjon:

Konverter SQL-spørring til søkeforespørsel

For å konvertere den forrige SQL-søkeforespørselen til en Elasticsearch-forespørsel, kan vi sende den inn i translate API som vist nedenfor:

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

{

'query': ' \n VELG tittel, varighet, vurdering, skriv FRA 'netflix' WHERE type = '
\ '' Film ' \' ' OG utgivelsesår >= 2020 \n ',

'
hente_størrelse ': 5

}'

API-en bør analysere SQL-inndataene og konvertere den til en gyldig søkeforespørsel, som vist i følgende utdata:

{
'størrelse' : 5 ,
'spørsmål' : {
'bool' : {
'må' : [
{
'begrep' : {
'type' : {
'verdi' : 'Film'
}
}
},
{
'område' : {
'utgivelsesår' : {
'gte' : 2020 ,
'øke' : 1
}
}
}
],
'øke' : 1
}
},
'_kilde' : falsk,
'Enger' : [
{
'felt' : 'tittel'
},
{
'felt' : 'varighet'
},
{
'felt' : 'vurdering'
},
{
'felt' : 'type'
}
],
'sortere' : [
{
'_doc' : {
'rekkefølge' : 'asc'
}
}
]
}

Du kan deretter bruke dette forespørselsformatet til å sende til Elasticsearch søke-API som vist nedenfor:

krøll -XPOST 'http://localhost:9200/netflix/_search' -H 'kbn-xsrf: rapportering' -H 'Content-Type: application/json' -d '
{
'størrelse': 5,
'query': {
'bool': {
'må': [
{
'begrep': {
'type': {
'value': 'Film'
}
}
},
{
'område': {
'release_year': {
'gte': 2020,
'boost': 1
}
}
}
],
'boost': 1
}
},
'_source': usant,
'Enger': [
{
'field': 'tittel'
},
{
'field': 'varighet'
},
{
'field': 'vurdering'
},
{
'field': 'type'
}
],
'sort': [
{
'_doc': {
'order': 'asc'
}
}
]
}'

På samme måte skal forespørselen returnere lignende data som vist nedenfor:

Konklusjon

Gjennom dette innlegget oppdaget du hvordan du kan bruke SQL-spørringer til å hente data fra en eksisterende Elasticsearch-indeks. Du har også lært hvordan du bruker oversett SQL API for å konvertere en gyldig SQL-spørring til en Elasticsearch-forespørsel.