ElasticSearch客户端搜索函数

n8ghc7c1  于 2022-11-02  发布在  ElasticSearch
关注(0)|答案(1)|浏览(141)

我们正在尝试实现嵌套查询,如下所示:
并且想知道是否可以根据创建的查询对象的数量动态地添加查询对象。
例如,如果我只想按名称或按最大价格搜索,或者同时按名称和按最大价格搜索,有没有比使用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
);
}
crcmnpdw

crcmnpdw1#

您可以使用QueryBuilder类在Java中构建这种类型的条件查询。下面是上面示例的简化代码-

BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
    if(name != null){
      queryBuilder.must(QueryBuilders.matchQuery("name","searchText"));
    }
    if(price != null){
      queryBuilder.must(QueryBuilders.rangeQuery("price").gte(maxPrice));
    }
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    searchSourceBuilder.query(queryBuilder);
    SearchRequest searchRequest = new SearchRequest("products");
    searchRequest.source(searchSourceBuilder);
    esClient.search(searchRequest, RequestOptions.DEFAULT);

相关问题