2016-09-27 4 views
0

Я ищу элегантный способ получить документ, который имеет наибольшее значение в определенной области его. Например, я хочу получить документ с наибольшей меткой времени. Я пробовал использовать агрегации, но мне не удалось заставить его работать, он только вернет поле. Я также рассмотрел использование сортировки и выбор первого элемента, но я нахожу это немного грубой силой. Такой запрос будет выглядеть примерно так:Весна elasticsearch - получить документ, который имеет наибольшее значение в поле

SearchQuery searchQuery = new NativeSearchQueryBuilder() 
      .withPageable(new PageRequest(0, 1)) 
      .withSort(SortBuilders.fieldSort(FIELD_TIMESTAMP) 
        .order(SortOrder.DESC)) 
      .build(); 

Есть ли лучший способ выполнить такую ​​задачу?

ответ

3

Вы можете использовать метод sort() метода SearchResponse, чтобы получить документ с наивысшим ответом.

Для вашего запроса, это должно быть так:

FieldSortBuilder timestampSort = SortBuilders.fieldSort(FIELD_TIMESTAMP).order(SortOrder.DESC); 

SearchResponse response = client.prepareSearch(index) 
      .addSort(timestampSort) 
      .setSize(1) 
      .execute() 
      .actionGet(); 

Над запрос будет возвращать только один документ, то есть: первый документ из вашего ответа на запрос.