如何使用 NativeSearchQueryBuilder() 实现动态搜索?

How to implement search dynamically with NativeSearchQueryBuilder()?

如果userId为null,我想去除.withQuery(QueryBuilders.matchQuery("createdBy",userId))这个条件,如何根据我传递的参数实现动态搜索

 public <T> List<T> search(String index, String type, String tenantId ,String userId, String queryString, Class<T> clzz){
    log.debug("==========search==========");
    String allField = "_all";
    MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery(queryString, allField);

    SearchQuery searchQuery = new NativeSearchQueryBuilder()
            .withIndices(index)
            .withTypes(type)
            .withQuery(multiMatchQueryBuilder)
            .withQuery(QueryBuilders.matchQuery("tenantId",tenantId))
            .withQuery(QueryBuilders.matchQuery("createdBy",userId))
            .build();
    List<T> list =
            operations.queryForPage(searchQuery,clzz).getContent();
    return list;
}

对,matchQuery不接受空值并抛出:

java.lang.IllegalArgumentException: [match] requires query value

NativeSearchQueryBuilder 是一个与任何其他对象一样的对象,因此您可以在一些额外的准备工作后构建它。可能不是最漂亮的,但会做你想做的事:

NativeSearchQueryBuilder nativeSearch = new NativeSearchQueryBuilder()
    .withIndices(index)
    .withTypes(type)
    .withQuery(multiMatchQueryBuilder)
    .withQuery(QueryBuilders.matchQuery("tenantId", tenantId));

if (userId != null) {
    nativeSearch.withQuery(QueryBuilders.matchQuery("createdBy", userId));
}

SearchQuery searchQuery = nativeSearch.build();