【问题标题】:Elasticsearch Jest client add condition to json queryElasticsearch Jest 客户端向 json 查询添加条件
【发布时间】:2021-01-05 07:29:45
【问题描述】:

我正在使用 Elasticsearch 6.3 和 Jest 客户端 6.3 (Java API)

Search search = new Search.Builder(jsonQueryString)
                    .addIndex("SOME_INDEX")
                    .build();
SearchResult result = jestClient.execute(search);

这是我的 JSON 查询示例

{
"query": {
    "bool" : {
        "filter": {
            "match" :{ 
                "someField" : "some value" 
                }
            }
        }
    }
}

JSON 查询字符串被接受为 POST 请求正文,然后传递给 Jest 客户端。在我可以在 Jest 客户端上执行 json 查询之前,我需要为查询添加条件,例如

{
"query": {
    "bool" : {
        "filter": {
            "match" :{ 
                "someField" : "some value" 
                }
            }
        },
        "must": {
            "match" :{ 
                "systemField" : "pre-defined value" 
                }
            }
        }
    }
}

在 Jest 客户端执行之前,是否有允许解析 JSON 查询并向其添加条件的 API? JSON 查询可以是 Query DSL 支持的任何查询,不一定包含布尔条件。我需要在查询中添加一个预定义的条件。我很感激这方面的任何帮助。非常感谢。

【问题讨论】:

    标签: elasticsearch elasticsearch-jest


    【解决方案1】:

    没有开箱即用的 Elasticsearch 或 Jest API 来实现上述功能,我实现的解决方法是使用 Jackson ObjectMapper

    // convert the search request body into object node
    ObjectNode searchRequestNode = objectMapper.readValue(queryString, ObjectNode.class);
    // extract the query
    String query = searchRequestNode.get("query").toString();
    
    // wrap the original query and add conditions
    BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
    boolQueryBuilder.must(QueryBuilders.wrapperQuery(query));
    boolQueryBuilder.filter(QueryBuilders.termsQuery("fieldA", listOfValues));
    boolQueryBuilder.filter(QueryBuilders.termQuery("fieldB", value));
    
    // convert querybuilder to json query string
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    searchSourceBuilder.query(queryBuilder);
    String queryWithFilters = searchSourceBuilder.toString();
    
    // convert json string to object node
    ObjectNode queryNode = objectMapper.readValue(queryWithFilters, ObjectNode.class);
    
    // replace original query with the new query containing added conditions 
    searchRequestNode.set("query", queryNode.get("query"));
    String finalSearchRequestWithOwnFilters = searchRequestNode.toString();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-13
      • 2016-04-21
      • 1970-01-01
      • 2014-09-02
      相关资源
      最近更新 更多