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

时间:2014-09-16 02:47:07

标签: java json elasticsearch dsl

我在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)。

3 个答案:

答案 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)
...