/ / ElasticSearch - агрегації: фільтри та сортування відра - json, elasticsearch

ElasticSearch - агрегації: фільтри та сортування відра - json, elasticsearch

Використання ElasticSearch 5.2

Як приклад, я буду використовувати базу даних, що представляє всіх людей у ​​світі.

Приклад запиту: Отримайте середню заробітну плату людини, групуючись за країною, для всіх старших, ніж 30 років. (Відповідь повинна містити 10 найкращих країн із середньою заробітною платою)

Кроки, які я взяв для створення мого агрегаційного запиту:

  1. Фільтрувати вихідний набір даних (filter: age > 30)
  2. Сукупність на "country"
  3. Використовувати метрику середнього рівня в полі "salary"

Проблема, з якою я стикаюся, полягає в тому, що я можу застосувати фільтр до об'єднання або сортувати відро, але, схоже, ES не дозволяє мені робити обидва?
Іншими словами: я не можу застосувати мою "order"запит на"myInnerAggregation"тому що йому" передує "myFilterAggregation"

GET myIndex/_search
{
"size":0,
"aggs": {
"myAggregation": {
"terms": {
"size":10,
"field": "country",
"order": [
{
"myInnerAggregation": "desc"
// I cannot specify "myInnerAggregation" here, only
// "myFilterAggregation" (because it"s out of scope I guess)
}
]
},
"aggs": {
"myFilterAggregation": {
"filter": { /* age > 30 (filter syntax is not the problem)*/},
"aggs": {
"myInnerAggergation": {
"avg": {
"field": "salary"
}
}
}
}
}
}

} }

Я бачив, що ES 6.1+ має підтримку "bucket_sort", який, ймовірно, вирішить цю проблему, але я не можу повірити, що проста агрегація, подібна до цього, не може бути оброблена ES 5.2?

Відповіді:

0 для відповіді № 1

Це має зробити фокус:

"order": [
{
"MyFilterAggregation>MyInnerAggregation": "desc"
}
]

0 для відповіді № 2

Спробуйте перемістити фільтр до query частина запиту. Ви не повинні оголосити фільтр як агрегацію, агрегації поважають фільтри, визначені в query частина вашого запиту. Сподіваємося, таким чином ви зможете вирішити проблему.