Elasticsearch Jest 客户端向 json 查询添加条件
Elasticsearch Jest client add condition to json query
我正在使用 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 允许在 Jest 客户端上执行之前解析 JSON 查询并向其添加条件? JSON 查询可以是 Query DSL 支持的任何查询,不一定包含 bool 条件。我需要向查询添加预定义条件。我很感激这方面的任何帮助。非常感谢。
没有开箱即用的 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();
我正在使用 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 允许在 Jest 客户端上执行之前解析 JSON 查询并向其添加条件? JSON 查询可以是 Query DSL 支持的任何查询,不一定包含 bool 条件。我需要向查询添加预定义条件。我很感激这方面的任何帮助。非常感谢。
没有开箱即用的 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();