您可以使用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进行复合条件查询。
 */
func BoolQuery(client *tablestore.TableStoreClient, tableName string, indexName string) {
    searchRequest := &tablestore.SearchRequest{}
    searchRequest.SetTableName(tableName)
    searchRequest.SetIndexName(indexName)

    /**
     * 查询条件一:RangeQuery,Col_Long这一列的值要大于3
     */
    rangeQuery := &search.RangeQuery{}
    rangeQuery.FieldName = "Col_Long"
    rangeQuery.GT(3)

    /**
     * 查询条件二:MatchQuery,Col_Keyword这一列的值要匹配"hangzhou"
     */
    matchQuery := &search.MatchQuery{}
    matchQuery.FieldName = "Col_Keyword"
    matchQuery.Text = "hangzhou"

    {
        /**
         * 构造一个BoolQuery,设置查询条件是必须同时满足"条件一"和"条件二"
         */
        boolQuery := &search.BoolQuery{
            MustQueries: []search.Query{
                rangeQuery,
                matchQuery,
            },
        }
        searchQuery := search.NewSearchQuery()
        searchQuery.SetQuery(boolQuery)
        searchRequest.SetSearchQuery(searchQuery)
        searchResponse, err := client.Search(searchRequest)
        if err != nil {
            fmt.Printf("%#v", err)
            return
        }
        fmt.Println("IsAllSuccess: ", searchResponse.IsAllSuccess) // 查看返回结果是否完整
        fmt.Println("TotalCount: ", searchResponse.TotalCount) // 匹配的总行数
        fmt.Println("RowCount: ", len(searchResponse.Rows))
    }
    {
        /**
         * 构造一个BoolQuery,设置查询条件是至少满足"条件一"和"条件二"中的一个
         */
        boolQuery := &search.BoolQuery{
            ShouldQueries: []search.Query{
                rangeQuery,
                matchQuery,
            },
            MinimumShouldMatch: proto.Int32(1),
        }
        searchQuery := search.NewSearchQuery()
        searchQuery.SetQuery(boolQuery)
        searchRequest.SetSearchQuery(searchQuery)
        searchResponse, err := client.Search(searchRequest)
        if err != nil {
            fmt.Printf("%#v", err)
            return
        }
        fmt.Println("IsAllSuccess: ", searchResponse.IsAllSuccess) // 查看返回结果是否完整
        fmt.Println("TotalCount: ", searchResponse.TotalCount) // 匹配的总行数
        fmt.Println("RowCount: ", len(searchResponse.Rows))
    }
}