【问题标题】:How to construct QueryBuilder from JSON DSL when using Java API in ElasticSearch?在 ElasticSearch 中使用 Java API 时如何从 JSON DSL 构造 QueryBuilder?
【发布时间】:2023-03-04 16:57:01
【问题描述】:

我在 Spring Web 项目中使用 ElasticSearch 作为搜索服务,它使用传输客户端与 ES 通信。

我想知道是否存在可以从 JSON DSL 构造 QueryBuilder 的方法。例如,将此布尔查询 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


    【解决方案1】:

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

    【讨论】:

    • 通过省略 json 字符串中的 {"query":} 部分很有魅力!
    【解决方案2】:

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

    【讨论】:

    • 感谢您的回答,我在 ES API 中找到了两种可以将 DSL 字符串包装到 QueryBuilder 的方法,一种是 WrapperQueryBuilder,另一种是 QueryBuilders.wrapperQuery()
    • 省略 {"query":} 部分对我有很大帮助,再次感谢您的帮助。
    • 对于那些使用 ES 5.0 的人,这不再有效:discuss.elastic.co/t/…
    • @GordonThompson 确切地说,对于那些使用较新版本的人,请务必检查 WrapperQuery。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2021-07-07
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 2020-03-10
      • 2019-02-09
      • 1970-01-01
      • 1970-01-01
      • 2020-09-03
      相关资源
      最近更新 更多