2016-09-27 2 views
0

Je cherche une manière élégante de récupérer le document qui a la plus grande valeur dans un certain champ de son. Par exemple, je souhaite récupérer le document dont l'horodatage est le plus important. J'ai essayé d'utiliser des agrégations, mais je n'arrivais pas à le faire fonctionner, cela renvoyait seulement un champ. J'ai aussi envisagé d'utiliser le tri et la récupération du premier élément, mais je trouve ça un peu brutal. Une telle requête serait quelque chose comme:Spring elasticsearch - Récupère le document qui a la plus grande valeur dans un champ

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

est-il un moyen de faire mieux une telle tâche?

Répondre

3

Vous pouvez utiliser la méthode size() de SearchResponse pour obtenir le document avec la réponse la plus élevée.

Pour votre requête, il devrait ressembler à ceci:

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

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

Au-dessus de requête renverra un seul document, i.e.: premier document de votre réponse à la requête.