NoneSql запрос перевода Query DSL кибана
Пожалуйста, объясните логику перевода запросов из sql в консоли kibana. Наиболее запутанным является "order": "asc", в то время как я запрашиваю desc.
Числа "10985" и "11030" также выглядят очень странно. Если я перезапущу перевод, эти цифры меняются.
Я делаю перевод запроса:
POST _sql/translate
{
"query": "SELECT day_of_week, avg(taxful_total_price) FROM kibana_sample_data_ecommerce WHERE customer_id = 52 GROUP BY day_of_week ORDER BY avg(taxful_total_price) DESC LIMIT 2"
}
Перевод:
{
"size" : 0,
"query" : {
"term" : {
"customer_id" : {
"value" : 52,
"boost" : 1.0
}
}
},
"_source" : false,
"stored_fields" : "_none_",
"aggregations" : {
"groupby" : {
"composite" : {
"size" : 1000,
"sources" : [
{
"10985" : {
"terms" : {
"field" : "day_of_week",
"missing_bucket" : true,
"order" : "asc"
}
}
}
]
},
"aggregations" : {
"11030" : {
"avg" : {
"field" : "taxful_total_price"
}
}
}
}
}
}
1 ответ
Что касается изменяющегося числа, они являются только названиями агрегации; как если бы вы использовали "AS 11030" в sql. Это позволяет вам использовать агрегацию в другой агрегации, ссылаясь на ее имя. Обязательно иметь имя для агрегации в структуре запроса ES. Возможно, это нормальное поведение перевода, чтобы случайным образом называть агрегаты числами. Он не должен иметь отношение к результатам запроса или его поведению.
Имена агрегации не имеют значения, они генерируются случайным образом, но ES-SQL отслеживает, что есть что (очевидно), и всякий раз, когда одной агрегации нужен результат другой, он знает, какой из них использовать.
Существует запрос на улучшение - https://github.com/elastic/elasticsearch/issues/43531 - для согласованного именования, чтобы можно было использовать кеширование. Еще не реализовано и в настоящее время не входит в дорожную карту ближайшего будущего.
Взяв во внимание asc
Несоответствие DESC, если вы обратите пристальное внимание, ваш DESC
заказ включен AVG
в то время как asc
сортировка для composite
с terms
агрегации, а это разные вещи. ES-SQL выполняет сортировку на "клиентской" стороне агрегатов (в отличие от сервера /ES-стороны), потому что нет ES-запроса, который бы выполнял эту сортировку при использованииcomposite
агрегация.
Суть в том, что запрос, который вы видите, завершен, но не совсем, потому что запрос ES-SQL выполняется в Elasticsearch, но есть также задача на стороне клиента, которая выполняет фактическую сортировку с помощью AVG. Существует вопрос улучшения уже открыт для повышенияtranslate
API, чтобы указать, что, по крайней мере, сгенерированного запроса может быть недостаточно для достижения тех же результатов, которые были бы у одного пользователя, если бы он / она выполнял этот запрос на самом ES.