Как построить QueryBuilder из JSON DSL при использовании Java API в ElasticSearch?

Я использую ElasticSearch в качестве службы поиска в веб-проекте Spring, который использует Transport Client для связи с ES.

Мне интересно, существует ли метод, который может построить QueryBuilder из JSON DSL. например, преобразовать этот запрос bool DSL JSON в QueryBuilder.

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

Мне нужен этот метод, потому что я должен получить ввод строки пользователя bool из веб-интерфейса и проанализировать эту строку bool на QueryBuilder. Однако это не подходит для использования QueryBuilders.boolQuery().must(matchQB).should(shouldQB).must_not(mustNotQB). Потому что нам может потребоваться несколько запросов must или non.

Если существует способ, который может построить QueryBuilder из JSON DSL или существуют альтернативные решения, это будет намного проще.

PS: Я нашел два метода, которые могут обернуть DSL String в QueryBuilder для поиска ES. Один из них - WrapperQueryBuilder, подробности см. Здесь. http://javadoc.kyubu.de/elasticsearch/HEAD/org/elasticsearch/index/query/WrapperQueryBuilder.html Другой - QueryBuilders.wrapperQuery (String DSL).

Ответы

Ответ 1

Вы можете использовать QueryBuilders.wrapperQuery(jsonQueryString);

Ответ 2

Вы можете использовать setQuery, который может получать строку формата json.

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

Обратите внимание: требуется только часть DSL, часть {"query": } опущена, например:

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

Ответ 3

Возможно, стоит исследовать клиент низкого уровня отдыха. С этим вы можете сделать:

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());