使用Java Api的条件语句构建ElasticSearch BoolQuery



我有一些查询我的代码非常相似。我想通过使用条件语句来缩短和清理构建通用boolQuery的代码。这些是我的方法:

private SearchRequestBuilder createSearchRequestInRangeForGroupId( String groupId,Date rangeStart,Date rangeEnd) {
          ...
          .setQuery(filteredQuery(
                    boolQuery()
                          .must(matchQuery(FIELD_GROUP_NAME, groupId)),
                          rangeFilter(FIELD_TIMESTAMP).gte(rangeStart.getTime()).lte(rangeEnd.getTime())))
          ...         
    }
private SearchRequestBuilder createSearchRequestInRangeForGender( String gender,Date rangeStart,Date rangeEnd) {
          ...
          .setQuery(filteredQuery(
                    boolQuery()
                          .must(matchQuery(FIELD_GENDER, gender)),
                          rangeFilter(FIELD_TIMESTAMP).gte(rangeStart.getTime()).lte(rangeEnd.getTime())))
          ...
    }
private SearchRequestBuilder createSearchRequestInRangeForGroupIdAndGender( String groupId,String gender,Date rangeStart,Date rangeEnd) {
          ...
          .setQuery(filteredQuery(
                    boolQuery()
                          .must(matchQuery(FIELD_GROUP_NAME, groupId))
                          .must(matchQuery(FIELD_GENDER, gender)),
                          rangeFilter(FIELD_TIMESTAMP).gte(rangeStart.getTime()).lte(rangeEnd.getTime())))
          ....
        return searchRequestBuilder;
    }

我想做一个这样的boolQuery生成器:

private SearchRequestBuilder createSearchRequestInRange( String groupId,String gender,Date rangeStart,Date rangeEnd) {
        ...
        .setQuery(filteredQuery(
                  buildBoolQuery(groupId,gender),
                  rangeFilter(FIELD_TIMESTAMP).gte(rangeStart.getTime()).lte(rangeEnd.getTime())))
        ...
    }

private QueryBuilder buildBoolQuery(String groupId, String gender){
        QueryBuilder boolQuery = boolQuery();
       if(groupId!=null && !groupId.isEmpty())
            boolQuery = boolQuery.must(matchQuery(FIELD_GROUP_NAME, groupId))
       }
       if(gender!=null && !gender.isEmpty())
            boolQuery = boolQuery.must(matchQuery(FIELD_GENDER, gender))
       }
       return boolQuery;
}

我已经试过了,但是不可能。有什么办法可以做到吗?谢谢你。

这可能是因为您的boolQuery类型是QueryBuilder。你可能需要使用BoolQueryBuilder在BoolQueryBuilder query = QueryBuilders.boolQuery();

最新更新