我在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)。
答案 0 :(得分:22)
您可以使用QueryBuilders.wrapperQuery(jsonQueryString);
答案 1 :(得分:11)
您可以使用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();
答案 2 :(得分:0)
可能值得研究low level rest client。有了这个,你可以做到:
local.ERROR: Trailing data {"exception":"[object] (InvalidArgumentException(code: 0): Trailing data at \\vendor\\esbot\\carbon\\src\\Carbon\\Carbon.php:910)
[stacktrace]
#0 \\vendor\\laravel\\framework\\src\\Illuminate\\Database\\Eloquent\\Concerns\\HasAttributes.php(716): Carbon\\Carbon::createFromFormat('Y-m-d H:i:s', '2019-06-25 16:1...')
#1 \\vendor\\laravel\\framework\\src\\Illuminate\\Database\\Eloquent\\Concerns\\HasAttributes.php(739): Illuminate\\Database\\Eloquent\\Model->asDateTime('2019-06-25 16:1...')
#2 \\vendor\\laravel\\framework\\src\\Illuminate\\Database\\Eloquent\\Concerns\\HasAttributes.php(532): Illuminate\\Database\\Eloquent\\Model->fromDateTime('2019-06-25 16:1...')
#3 \\vendor\\laravel\\framework\\src\\Illuminate\\Database\\Eloquent\\Model.php(230): Illuminate\\Database\\Eloquent\\Model->setAttribute('created_at', '2019-06-25 16:1...')
#4 \\vendor\\laravel\\framework\\src\\Illuminate\\Database\\Eloquent\\Model.php(248): Illuminate\\Database\\Eloquent\\Model->fill(Array)
...