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

问题描述 投票:0回答:5

我在 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(字符串DSL)。

java json elasticsearch dsl
5个回答
36
投票

您可以使用

QueryBuilders.wrapperQuery(jsonQueryString);


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

1
投票

可能值得研究低级别休息客户端。有了这个你可以做:

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

0
投票

使用 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;
    }`

0
投票

对于查询(顺便说一句。原始查询包含错误,缺少右大括号)

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

解决方案如下,您只需从 JSON 传递“query”节点的值即可

QueryBuilders.wrapperQuery("""
    {
        "bool" : {
            "must" : { 
                "match" : {"content" : "quick"}},
            "should": { 
                "match": {"content" : "lazy"}
            }
        }
    }
    """);
© www.soinside.com 2019 - 2024. All rights reserved.