Elasticsearch - агрегирование по отфильтрованным данным - PullRequest
0 голосов
/ 05 февраля 2020

У меня есть запрос, который возвращает набор документов (100). Над этим я хочу применить агрегацию, потому что они наиболее актуальны. Когда я пытаюсь агрегировать, это возвращает агрегацию по всем результатам, а не по первым 100.

Запрос:

{
  "size": 100,
  "sort": [
   {
    "_score": {
    "order": "desc"
    }
   }
],
"from": 0,
"query": {
 .......
 },
  "aggregations": {
    "category.category_id": {
      "nested": {
        "path": "category"
       },
    "aggregations": {
     "category.category_id": {
       "terms": {
         "field": "category.category_id",
         "size": 2,
         "order": {
           "_count": "desc"
         }
       }
     }
   }
 }
}

Результат:

{
"took": 33,
"timed_out": false,
"_shards": {
 "total": 4,
 "successful": 4,
 "skipped": 0,
 "failed": 0
},
"hits": {
 "total": 1042,
 "max_score": 60,
 "hits": [...100 hits...]
},
"aggregations": {
 "category.category_id": {
  "doc_count": 5186,
  "category.category_id": {
   "doc_count_error_upper_bound": 0,
   "sum_other_doc_count": 196,
   "buckets": [
   {
     "key": 2,
     "doc_count": 1042
   },
   {
    "key": 2764,
    "doc_count": 272
   }
   ....
   ]
  }
 }
}

Ожидается:

{
"took": 33,
"timed_out": false,
"_shards": {
 "total": 4,
 "successful": 4,
 "skipped": 0,
 "failed": 0
},
"hits": {
 "total": 1042,
 "max_score": 60,
 "hits": [...100 hits...]
},
"aggregations": {
 "category.category_id": {
  "doc_count": 100,
  "category.category_id": {
   "doc_count_error_upper_bound": 0,
   "sum_other_doc_count": x,
   "buckets": [
   {
     "key": 2,
     "doc_count": x (x< 100) (eg 37)
   },
   {
    "key": 2764,
    "doc_count": y (y <= 100 -x) (eg 10)
   }
   ....
   ]
  }
 }
}

Можно ли агрегировать по отфильтрованным данным? или как я могу агрегировать по наиболее актуальным данным?

1 Ответ

1 голос
/ 05 февраля 2020

Вы можете использовать агрегацию фильтров, как описано в документации эластичного поиска

{
    "aggs" : {
        "agg_name" : {
            "filter" : { //Add your query },
            "aggs" : {
               "terms": {
                       "field": "category.category_id",
                      "size": 2,
                    "order": {
                     "_count": "desc"
                      }
            }
        }
    }
}

Если вы хотите, вы можете добавить еще одну агрегацию во 2-й агг

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...