web-dev-qa-db-fra.com

Comment construire QueryBuilder à partir de JSON DSL lorsque vous utilisez Java API dans ElasticSearch?

J'utilise ElasticSearch comme service de recherche dans le projet Web Spring qui utilise Transport Client pour communiquer avec ES.

Je me demande s'il existe une méthode qui peut construire un QueryBuilder à partir d'un DSL JSON. par exemple, convertissez cette requête booléenne DSL JSON en QueryBuilder.

{
    "query" : {
        "bool" : {
            "must" : { "match" : {"content" : "quick"},
            "should": { "match": {"content" : "lazy"}
        }
    }
}

J'ai besoin de cette méthode parce que je dois recevoir l'entrée de chaîne booléenne de l'utilisateur du côté frontal du Web et analyser cette chaîne booléenne vers un QueryBuilder. Cependant, il ne convient pas d'utiliser QueryBuilders.boolQuery().must(matchQB).should(shouldQB).must_not(mustNotQB). Parce que nous pouvons avoir besoin de plusieurs requêtes must ou non must.

S'il existe une méthode permettant de construire un QueryBuilder à partir de JSON DSL ou s'il existe des solutions alternatives, ce sera beaucoup plus facile.

PS: J'ai trouvé deux méthodes qui peuvent encapsuler une chaîne DSL dans un QueryBuilder pour la recherche ES. L'un est WrapperQueryBuilder , voir les détails ici. http://javadoc.kyubu.de/elasticsearch/HEAD/org/elasticsearch/index/query/WrapperQueryBuilder.html Un autre est QueryBuilders.wrapperQuery (Chaîne DSL).

20
Armstrongya

Vous pouvez utiliser QueryBuilders.wrapperQuery(jsonQueryString);

24
bradvido

Vous pouvez utiliser setQuery, qui peut recevoir une chaîne au format json.

/**
 * Constructs a new search source builder with a raw search query.
 */
public SearchRequestBuilder setQuery(String query) {
    sourceBuilder().query(query);
    return this;
}

Notez ceci: seule une partie de la DSL est nécessaire, le {"query": } une partie est omise, comme ceci:

SearchResponse searchResponse = client.prepareSearch(indices).setQuery("{\"term\": {\"id\": 1}}").execute().actionGet();
11
halfelf

Il pourrait être utile d'enquêter client de repos de bas nivea . Avec cela, vous pouvez faire:

RestClient esClient = RestClient.builder(new HttpHost("localhost", 9200, "http")).build();
Request request = new Request("POST", "/INDEX_NAME/_doc/_search");
request.setJsonEntity(yourJsonQueryString);

Response response = esClient.performRequest(request);

String jsonResponse = EntityUtils.toString(response.getEntity());
0
Sash