Elasticsearch Jest客户端向JSON查询添加条件

时间:2018-09-17 22:01:24

标签: elasticsearch jest

我正在将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" 
                }
            }
        }
    }
}

是否有一个API,可以解析JSON查询并为其添加条件,然后才能在Jest客户端上执行它? JSON查询可以是查询DSL支持的任何查询,并且不一定包含布尔条件。我需要向查询添加预定义条件。我对此表示感谢。非常感谢。

1 个答案:

答案 0 :(得分:0)

没有开箱即用的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();