2016-12-01 3 views
0

Аналогично Query the latest document of each type on Elasticsearch, у меня есть набор записей в ES. Ради примера, предположим, что это новость, а также, каждый с отображением:Elasticsearch получить последние документы, сгруппированные по нескольким полям

"news": { 
    "properties": { 
     "source": { "type": "string", "index": "not_analyzed" }, 
     "headline": { "type": "object" }, 
     "timestamp": { "type": "date", "format": "date_hour_minute_second_millis" }, 
     "user": { "type": "string", "index": "not_analyzed" } 
     "newspaper": { "type": "string", "index": "not_analyzed"} 
    } 
} 

Я могу получить последнюю «новость» для каждого пользователя с:

"size": 0, 
"aggs": { 
    "sources" : { 
     "terms" : { 
      "field" : "user" 
     }, 
     "aggs": { 
      "latest": { 
       "top_hits": { 
       "size": 1, 
       "sort": { 
        "timestamp": "desc" 
       } 
       } 
      } 
     } 
    } 
} 

Однако то, что я я пытаюсь добиться, чтобы получить последнюю статью за пользователя, за газету, и я не могу понять это правильно.

например.

  • Джон, Нью-Йорк Таймс, Title1
  • Джон, BBC, Заголовок 2
  • Джейн, штат Нью-Йорк Таймс, TITLE3
  • т.д.

ответ

0

Вы можете добавить еще terms суб-агрегация для поля newspaper как это

"size": 0, 
"aggs": { 
    "sources" : { 
     "terms" : { 
      "field" : "user" 
     }, 
     "aggs": { 
      "newspaper": { 
       "terms": { 
        "field": "newspaper" 
       }, 
       "aggs": { 
        "latest": { 
        "top_hits": { 
         "size": 1, 
         "sort": { 
          "timestamp": "desc" 
         } 
        } 
        } 
       } 
      } 
     } 
    } 
} 
Смежные вопросы