Elasticsearch SQL Translate API

Elasticsearch Sql Translate Api



В тази публикация ще научим как да преведем SQL търсене във валидна заявка за API за търсене на Elasticsearch, съдържаща пълен език, специфичен за домейна на заявката, базиран на JSON.

Въпреки че това е малък API, той е много полезен инструмент, особено за разработчици, идващи от SQL бази данни. Може също така да намали кривата на обучение чрез бързо свързване на SQL заявките със съответните заявки за търсене.

След това можете да изследвате пълните възможности на API за търсене Elasticsearch и поддържаните езици за заявки.







Трябва да имате предвид, че въпреки че Elasticsearch поддържа SQL, той съдържа различни ограничения.



Синтаксис на заявката

Следното показва синтаксиса на API за превод:



ВЗЕМЕТЕ _sql/превод

{

тяло_на_заявката

}

Можете също да изпратите заявка за публикуване до API за превод, както е показано в следния синтаксис:





POST _sql/превод

{

тяло_на_заявката

}

В зависимост от конфигурацията на вашия клъстер, API може да изисква привилегии за четене на индекса, чиито данни искате да направите заявка. Можете също да посочите целевия ресурс като псевдоним на индекс или поток от данни.

В request_body можете да посочите всички параметри на тялото на заявката на SQL Search API. Разгледайте предоставените документи в следния ресурс, за да научите повече:



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

Като отговор заявката трябва да върне резултата, съответстващ на API за търсене със заявените данни.

Пример

За да илюстрираме най-добре как да използваме този API, ще приемем, че имаме индекс, наречен „netflix“, съдържащ всички данни за филми и телевизионни предавания на Netflix.

Да предположим, че искаме да извлечем петте най-добри филма от индекса на Netflix, които пуснахме през 2020 г. и по-горе:

Еквивалентната SQL заявка може да бъде изразена, както е показано по-долу:

ИЗБЕРЕТЕ заглавие, продължителност, рейтинг, тип ОТ netflix WHERE тип = 'Филм' И година на издаване >= 2020 г

За да изпълним горното SQL търсене в Elasticsearch, можем да го поставим в API за SQL търсене, както е показано по-долу:

къдря -XGET „http://localhost:9200/_sql?format=txt“ 'kbn-xsrf: докладване' „Тип съдържание: приложение/json“ '

{

'заявка': ' ИЗБЕРЕТЕ заглавие, продължителност, рейтинг, тип FROM 'netflix' WHERE type = '
\ '' Филм ' \' ' И година на издаване >= 2020 г ',

'
fetch_size “: 5

}'

Предишната заявка трябва да отправи запитване към индекса и да извлече съответстващите записи. Връщането е в текстов формат, както е посочено по-долу:

Както виждаме, Elasticsearch връща очаквания резултат.

За да върнем изхода като JSON, можем да зададем формата на JSON, както е показано по-долу:

къдря -XGET 'http://localhost:9200/_sql?format=json' 'kbn-xsrf: докладване' „Тип съдържание: приложение/json“ '

{

'заявка': ' ИЗБЕРЕТЕ заглавие, продължителност, рейтинг, тип FROM 'netflix' WHERE type = '
\ '' Филм ' \' ' И година на издаване >= 2020 г ',

'
fetch_size “: 5

}'

Изход:

Преобразувайте SQL заявка в заявка за търсене

За да преобразуваме предишната SQL заявка за търсене в Elasticsearch заявка, можем да я предадем в API за превод, както е показано по-долу:

къдря -XGET 'http://localhost:9200/_sql/translate' 'kbn-xsrf: докладване' „Тип съдържание: приложение/json“ '

{

'заявка': ' ИЗБЕРЕТЕ заглавие, продължителност, рейтинг, тип FROM 'netflix' WHERE type = '
\ '' Филм ' \' ' И година на издаване >= 2020 г ',

'
fetch_size “: 5

}'

API трябва да анализира входния SQL вход и да го преобразува във валидна заявка за търсене, както е показано в следния изход:

{
'размер' : 5 ,
'запитване' : {
'bool' : {
'трябва да' : [
{
'термин' : {
'Тип' : {
'стойност' : 'Филм'
}
}
},
{
'обхват' : {
'година_на_издаване' : {
'gte' : 2020 г ,
'подсилване' : 1
}
}
}
],
'подсилване' : 1
}
},
'_източник' : невярно,
'поля' : [
{
'поле' : 'заглавие'
},
{
'поле' : 'продължителност'
},
{
'поле' : 'рейтинг'
},
{
'поле' : 'Тип'
}
],
'вид' : [
{
'_doc' : {
'поръчка' : 'възходящ'
}
}
]
}

След това можете да използвате този формат на заявка, за да изпратите до API за търсене на Elasticsearch, както е показано по-долу:

къдря -XPOST 'http://localhost:9200/netflix/_search' 'kbn-xsrf: докладване' „Тип съдържание: приложение/json“ '
{
'размер': 5,
'заявка': {
'bool': {
'трябва да': [
{
'термин': {
'Тип': {
'value': 'Филм'
}
}
},
{
'обхват': {
'release_year': {
'gte': 2020,
'подсилване': 1
}
}
}
],
'подсилване': 1
}
},
'_source': невярно,
'полета': [
{
'поле': 'заглавие'
},
{
'поле': 'продължителност'
},
{
'поле': 'рейтинг'
},
{
'поле': 'тип'
}
],
'вид': [
{
'_doc': {
'поръчка': 'възходящо'
}
}
]
}'

По същия начин заявката трябва да върне подобни данни, както е показано по-долу:

Заключение

Чрез тази публикация открихте как можете да използвате SQL заявки за извличане на данни от съществуващ индекс на Elasticsearch. Освен това научихте как да използвате API за превод на SQL, за да конвертирате валидна SQL заявка в заявка за Elasticsearch.