Retourner une liste d'ids sous forme d'un seul document plutot qu'une liste de documents en retour d'une requête de recherche


(Blured Derulb) #1

Bonjour,

Je cherche à faire une simple requête de recherche du type { "query": { "term": { "text": "co" } } },
seulement je voudrais que le résultat renvoyé par elastic soit formatté sous la forme d'un seul document contenant la liste des ids de documents concerné.

Exemple {"docs": [2, 55, 66, 234, 423]}

Est-ce possible nativement, avec les aggrégation peut être ?

Je me pose cette question car certaines requêtes effectués me retournent énormément de résultat et le fetch de tous ces résultats est assez lent même en utilisant un cursor.

Merci d'avance pour vos réponses

Blured.


(David Pilato) #2

Regarde ça, ça devrait t'aider : https://www.elastic.co/guide/en/elasticsearch/reference/current/common-options.html#_response_filtering

A noter que ça serait aussi bien de combiner ça avec https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-fields.html en mettant une liste vide.


(Blured Derulb) #3

Merci beaucoup.

En parallèle j'ai trouvé ça qui permet de répondre aussi ma problématique au cas où ça puisse resservir à quelqu'un :

SearchResponse sr = elasticSearchService.getClient().prepareSearch()
            .setQuery(matchQuery("text", "hotel").operator(org.elasticsearch.index.query.MatchQueryBuilder.Operator.AND)
                    .fuzziness(Fuzziness.ONE).minimumShouldMatch("100%"))
            .addAggregation(AggregationBuilders.terms("by_code").field("code").size(Integer.MAX_VALUE)                        
            )                
            .setSize(Integer.MAX_VALUE)               
            .setExplain(false)
            .setTrackScores(false)
            .setSize(1)
            //.setFetchSource(false)    
            //.setNoFields()            
            .execute()
            .actionGet();
    
    StringTerms st = sr.getAggregations().get("by_code");
    int i = 0;
    List<String> llBucketsIds = new ArrayList<String>();
    for (Bucket b : st.getBuckets()) {
        llBucketsIds.add(b.getKey());           
    }

(system) #4