Elasticsearch SQL Translate-API

Elasticsearch Sql Translate Api



In dit bericht leren we hoe we een SQL-zoekopdracht kunnen vertalen naar een geldig Elasticsearch-zoek-API-verzoek met volledige Query Domain Specific Language op basis van JSON.

Hoewel dit een kleine API is, is het een zeer nuttig hulpmiddel, vooral voor ontwikkelaars die uit SQL-databases komen. Het kan ook de leercurve verminderen door de SQL-query's snel te relateren aan de bijbehorende zoekopdrachten.

U kunt vervolgens de volledige mogelijkheden van de Elasticsearch-zoek-API en de ondersteunde querytalen verkennen.







Houd er rekening mee dat, hoewel Elasticsearch SQL ondersteunt, het verschillende beperkingen bevat.



Querysyntaxis

Het volgende toont de syntaxis van de vertaal-API:



GET _sql/vertalen

{

request_body

}

U kunt ook een postverzoek naar de vertaal-API sturen, zoals weergegeven in de volgende syntaxis:





POST _sql/vertalen

{

request_body

}

Afhankelijk van uw clusterconfiguratie kan de API leesrechten vereisen voor de index waarvan u de gegevens wilt opvragen. U kunt de doelbron ook opgeven als een indexalias of een gegevensstroom.

In de request_body kunt u alle hoofdtekstparameters van de SQL Search API opgeven. Bekijk de documenten in de volgende bron voor meer informatie:



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

Als antwoord moet de query het resultaat retourneren dat overeenkomt met de zoek-API met de opgevraagde gegevens.

Voorbeeld

Om het beste te illustreren hoe deze API te gebruiken, gaan we ervan uit dat we een index hebben met de naam 'netflix' met alle gegevens over Netflix-films en tv-programma's.

Stel dat we de top vijf films willen ophalen uit de Netflix-index die we in het jaar 2020 en hoger hebben uitgebracht:

De equivalente SQL-query kan als volgt worden uitgedrukt:

SELECTEER titel, duur, beoordeling, type FROM netflix WHERE type = 'Film' EN uitgave_jaar >= 2020

Om de bovenstaande SQL-zoekopdracht in Elasticsearch uit te voeren, kunnen we deze in de SQL Search API plaatsen, zoals hieronder wordt weergegeven:

krul -XGET “http://localhost:9200/_sql?format=txt” -H 'kbn-xsrf: rapportage' -H 'Inhoudstype: applicatie/json' -d '

{

'vraag': ' \n SELECTEER titel, duur, beoordeling, type FROM 'netflix' WHERE type = '
\ '' Film ' \' ' EN uitgave_jaar >= 2020 \n ',

'
fetch_size ': 5

}'

Het vorige verzoek moet de index opvragen en de overeenkomende records ophalen. De retouruitvoer is in tekstformaat zoals hieronder aangegeven:

Zoals we kunnen zien, retourneert Elasticsearch de verwachte output.

Om de uitvoer als JSON te retourneren, kunnen we het formaat instellen op JSON zoals hieronder wordt weergegeven:

krul -XGET 'http://localhost:9200/_sql?format=json' -H 'kbn-xsrf: rapportage' -H 'Inhoudstype: applicatie/json' -d '

{

'vraag': ' \n SELECTEER titel, duur, beoordeling, type FROM 'netflix' WHERE type = '
\ '' Film ' \' ' EN uitgave_jaar >= 2020 \n ',

'
fetch_size ': 5

}'

Uitgang:

Converteer SQL-query naar zoekverzoek

Om de vorige SQL-zoekopdracht om te zetten in een Elasticsearch-verzoek, kunnen we deze doorgeven aan de vertaal-API, zoals hieronder weergegeven:

krul -XGET 'http://localhost:9200/_sql/translate' -H 'kbn-xsrf: rapportage' -H 'Inhoudstype: applicatie/json' -d '

{

'vraag': ' \n SELECTEER titel, duur, beoordeling, type FROM 'netflix' WHERE type = '
\ '' Film ' \' ' EN uitgave_jaar >= 2020 \n ',

'
fetch_size ': 5

}'

De API moet de invoer SQL-invoer ontleden en converteren naar een geldige zoekopdracht, zoals weergegeven in de volgende uitvoer:

{
'maat' : 5 ,
'vraag' : {
'boel' : {
'moeten' : [
{
'termijn' : {
'type' : {
'waarde' : 'Film'
}
}
},
{
'bereik' : {
'jaar van uitgave' : {
'gte' : 2020 ,
'boost' : 1
}
}
}
],
'boost' : 1
}
},
'_bron' : vals,
'velden' : [
{
'veld' : 'titel'
},
{
'veld' : 'looptijd'
},
{
'veld' : 'beoordeling'
},
{
'veld' : 'type'
}
],
'soort' : [
{
'_doc' : {
'bestellen' : 'asc'
}
}
]
}

U kunt dit verzoekformaat vervolgens gebruiken om naar de Elasticsearch-zoek-API te verzenden, zoals hieronder wordt weergegeven:

krul -XPOST 'http://localhost:9200/netflix/_search' -H 'kbn-xsrf: rapportage' -H 'Inhoudstype: applicatie/json' -d '
{
'maat': 5,
'vraag': {
'boe': {
'moeten': [
{
'termijn': {
'type': {
'waarde': 'Film'
}
}
},
{
'bereik': {
'jaar van uitgave': {
'gte': 2020,
'boost': 1
}
}
}
],
'boost': 1
}
},
'_bron': onwaar,
'velden': [
{
'veld': 'titel'
},
{
'veld': 'duur'
},
{
'veld': 'beoordeling'
},
{
'veld soort'
}
],
'sorteren': [
{
'_doc': {
'bestellen': 'asc'
}
}
]
}'

Op dezelfde manier moet het verzoek vergelijkbare gegevens retourneren, zoals hieronder wordt weergegeven:

Conclusie

Via dit bericht heb je ontdekt hoe je SQL-query's kunt gebruiken om gegevens op te halen uit een bestaande Elasticsearch-index. Je hebt ook geleerd hoe je de translate SQL API kunt gebruiken om een ​​geldige SQL-query om te zetten naar een Elasticsearch-verzoek.