Ответ 1
Вы можете использовать QueryBuilders.wrapperQuery(jsonQueryString);
Я использую 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).
Вы можете использовать QueryBuilders.wrapperQuery(jsonQueryString);
Вы можете использовать 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();
Возможно, стоит исследовать клиент низкого уровня отдыха. С этим вы можете сделать:
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());