在ElasticSearch中使用Java API时如何从JSON DSL构造QueryBuilder?

我在Spring Web项目中使用ElasticSearch作为搜索服务,使用Transport Client与ES进行通信。

我想知道是否存在可以从JSON DSL构造QueryBuilder的方法。 例如,将此bool查询DSL JSON转换为QueryBuilder。

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

我需要这种方法,因为我必须从Web前端接收用户的bool字符串输入,并将此bool字符串解析为QueryBuilder。 但是它不适合使用QueryBuilders.boolQuery().must(matchQB).should(shouldQB).must_not(mustNotQB) 。 因为我们可能需要几个必须或非必须查询。

如果存在一个方法可以从JSON DSL构造一个QueryBuilder,或者存在替代解决方案,那将更容易。

PS:我找到了两种方法可以将DSL字符串包装到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();