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

nukf8bse  于 2023-05-30  发布在  ElasticSearch
关注(0)|答案(4)|浏览(379)

我在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 String Package 到QueryBuilder中进行ES搜索。一个是WrapperQueryBuilder,详见此处。http://javadoc.kyubu.de/elasticsearch/HEAD/org/elasticsearch/index/query/WrapperQueryBuilder.html另一个是QueryBuilders.wrapperQuery(String DSL)。

siv3szwd

siv3szwd1#

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

mm5n2pyu

mm5n2pyu2#

您可以使用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();
huwehgph

huwehgph3#

可能值得研究low level rest client。有了这个你可以做:

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());
vx6bjr1n

vx6bjr1n4#

使用RestHighLevelClient(使用lowLevelClient())

`Request request = new Request("POST", "yourURL");
    request.setJsonEntity(yourJsonDSL);
    try {
        Response response = restHighLevelClient.getLowLevelClient().performRequest(request);
        String jsonResponse = EntityUtils.toString(response.getEntity());
        JSONObject jsonTransactionObject = new JSONObject(jsonResponse);
    } catch (IOException ex) {
                //error;
    }`

相关问题