3 votes

Comment puis-je faire une SearchRequest dans ES 6.0 à partir d'une chaîne json en utilisant un client REST de haut niveau en Scala ?

Je suis en train de migrer de la version ES 1.7 à la version 6.0 et j'essaie de trouver un moyen d'effectuer une requête de recherche en passant une requête simple à l'adresse suivante Client Java REST de haut niveau . Pour que les requêtes soient faciles à lire (et à maintenir), nous voulons utiliser une chaîne Json au lieu de les construire avec le SearchSourceBuilder. C'était possible avant, mais je ne trouve pas de moyen agréable de le faire maintenant.

Exemple de requête :

 {
    "filter": {
        "bool": {
            "must": [
                {
                    "term": {
                        "status": "Success"
                    }
                },
                {
                    "term": {
                        "type": "someType"
                    }
                },
                {
                    "range": {
                        "endDateTime": {
                            "lte": "someDateTime"
                        }
                    }
                }
            ]
        }
    }
}

Exemple de code :

val searchRequest = buildSearchRequest(indexName, indexType, query)
val searchResponse = restHighLevelClient.search(searchRequest)

Je sais qu'il est possible d'envoyer la requête à l'aide du LowLevelClient, mais celui-ci renvoie une réponse et non une SearchResponse. Quelqu'un a-t-il déjà été confronté à ce problème ? Une solution de contournement ou une solution ?

3voto

Je suis un peu en retard, mais j'ai une solution proche de votre problème.

Tout d'abord, vous devez construire votre requête avec quelque chose comme ça :

private QueryBuilder buildQuery(MyObject object) {
    BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();

    QueryBuilder statusTerm = QueryBuilders.termQuery("status", object.getStatus());
    QueryBuilder typeTerm = QueryBuilders.termQuery("type", object.getType());
    QueryBuilder boolQuery = QueryBuilders.boolQuery()
            .must(statusTerm)
            .must(typeTerm);
    queryBuilder.should(boolQuery);

    return queryBuilder;
}

Ensuite, vous pouvez effectuer votre recherche et renvoyer SearchResponse :

private SearchResponse search(QueryBuilder query) throws IOException {

    SearchRequest request = new SearchRequest(elasticSearchClient.getElasticsearchClientProperties().getIndices());

    SearchSourceBuilder searchRequestBuilder = request.source();
    searchRequestBuilder.query(query);

    //SearchSourcebuilder allow you to set your query into your request

    return this.elasticSearchClient.search(request);
}

Enfin, on peut avoir une méthode qui appelle les deux ... :

public void processSearch(MyObject object) {
    QueryBuilder query = builQuery(object);
    SearchResponse response = search(query);
    List<FoundObjects> objects = parseResponse(response);
}

J'espère que cela pourra vous aider. Bonne chance !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X