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

2022-09-01 22:35:30

我在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的方法,或者存在替代解决方案,那么它将容易得多。

附言:我发现了两种方法,可以将DSL字符串包装到QueryBuilder以进行ES搜索。一个是WrapplerQueryBuilder,请参阅此处的详细信息。http://javadoc.kyubu.de/elasticsearch/HEAD/org/elasticsearch/index/query/WrapperQueryBuilder.html另一个是QueryBuilders.wrapperQuery(String DSL)。


答案 1

您可以使用QueryBuilders.wrapperQuery(jsonQueryString);


答案 2

您可以使用 ,它可以接收 json 格式字符串。setQuery

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