使用BoolQuery进行多条件的组合查询。BoolQuery可以包含一个或者多个子查询条件,根据子查询条件是否满足来判断一行数据是否满足查询条件。

可以设置多种组合方式,比如设置多个子查询条件为mustQueries,则要求这些子查询条件必须都满足。设置多个子查询条件为mustNotQueries时,要求这些子查询条件都不能满足。

BoolQuery有以下几个参数:



/**
 * 文档必须完全匹配所有的子query
 */
List<Query> mustQueries;
/**
 * 文档必须不能匹配任何子query
 */
List<Query> mustNotQueries;
/**
 * 文档必须完全匹配所有的子filter, filter类似于query,区别是不会进行算分
 */
List<Query> filterQueries;
/**
 * 文档应该至少匹配minimumShouldMatch个should条件,匹配多的得分会高
 */
List<Query> shouldQueries;
/**
 * 定义了至少满足几个should子句,默认是1.
 */
Integer minimumShouldMatch;

BoolQuery的子Query可以是任意Query类型,包括BoolQuery本身,因此通过BoolQuery可以实现非常复杂的组合查询类型。

示例


/**
 * 通过BoolQuery进行复合条件查询。
 * @param client
 */
public static void boolQuery(SyncClient client) {
    /**
     * 查询条件一:RangeQuery,Col_Long这一列的值要大于3
     */
    RangeQuery rangeQuery = new RangeQuery();
    rangeQuery.setFieldName("Col_Long");
    rangeQuery.greaterThan(ColumnValue.fromLong(3));

    /**
     * 查询条件二:MatchQuery,Col_Keyword这一列的值要匹配"hangzhou"
     */
    MatchQuery matchQuery = new MatchQuery(); // 设置查询类型为MatchQuery
    matchQuery.setFieldName("Col_Keyword"); // 设置要匹配的字段
    matchQuery.setText("hangzhou"); // 设置要匹配的值

    SearchQuery searchQuery = new SearchQuery();
    {
        /**
         * 构造一个BoolQuery,设置查询条件是必须同时满足"条件一"和"条件二"
         */
        BoolQuery boolQuery = new BoolQuery();
        boolQuery.setMustQueries(Arrays.asList(rangeQuery, matchQuery));
        searchQuery.setQuery(boolQuery);
        searchQuery.setGetTotalCount(true);
        SearchRequest searchRequest = new SearchRequest(TABLE_NAME, INDEX_NAME, searchQuery);
        SearchResponse resp = client.search(searchRequest);
        System.out.println("TotalCount: " + resp.getTotalCount()); // 匹配到的总行数,非返回行数
        System.out.println("Row: " + resp.getRows());
    }

    {
        /**
         * 构造一个BoolQuery,设置查询条件是至少满足"条件一"和"条件二"中的一个条件
         */
        BoolQuery boolQuery = new BoolQuery();
        boolQuery.setShouldQueries(Arrays.asList(rangeQuery, matchQuery));
        boolQuery.setMinimumShouldMatch(1); // 设置最少满足一个条件
        searchQuery.setQuery(boolQuery);
        searchQuery.setGetTotalCount(true);
        SearchRequest searchRequest = new SearchRequest(TABLE_NAME, INDEX_NAME, searchQuery);
        SearchResponse resp = client.search(searchRequest);
        System.out.println("TotalCount: " + resp.getTotalCount()); // 匹配到的总行数,非返回行数
        System.out.println("Row: " + resp.getRows());
    }
}