我们正在尝试实现嵌套查询,如下所示:
并且想知道是否可以根据创建的查询对象的数量动态地添加查询对象。
例如,如果我只想按名称或按最大价格搜索,或者同时按名称和按最大价格搜索,有没有比使用if/else语句更简单的方法将查询对象添加到搜索函数中?
使用Elastic 8.3版
感谢您的帮助
范例
if ( name != null ){
Query byName = MatchQuery.of(m -> m
.field("name")
.query(searchText)
)._toQuery();
}
if( price != null ) {
Query byMaxPrice = RangeQuery.of(r -> r
.field("price")
.gte(JsonData.of(maxPrice))
)._toQuery();
}
if ( name != null && price != null) {
SearchResponse<Product> response = esClient.search(s -> s
.index("products")
.query(q -> q
.bool(b -> b
.must(byName)
.must(byMaxPrice)
)
),
Product.class
);
} else if ( name != null && price == null ) {
SearchResponse<Product> response = esClient.search(s -> s
.index("products")
.query(q -> q
.bool(b -> b
.must(byName)
)
),
Product.class
);
} else if ( name == null && price != null ) {
SearchResponse<Product> response = esClient.search(s -> s
.index("products")
.query(q -> q
.bool(b -> b
.must(byMaxPrice)
)
),
Product.class
);
}
1条答案
按热度按时间crcmnpdw1#
您可以使用QueryBuilder类在Java中构建这种类型的条件查询。下面是上面示例的简化代码-