多条件组合查询

更新时间:
复制为 MD 格式

多条件组合查询(BoolQuery)的查询条件包含一个或者多个子查询条件,根据子查询条件来判断一行数据是否满足查询条件。每个子查询条件可以是任意一种Query类型,包括BoolQuery。

前提条件

参数

参数

说明

TableName

数据表名称。

IndexName

多元索引名称。

MustQueries

逻辑 AND 运算符。子查询列表,行数据必须满足所有子查询条件才返回。

MustNotQueries

逻辑 NOT 运算符。子查询列表,满足任意子查询条件的行数据将被排除。

FilterQueries

逻辑 AND 运算符,以筛选器方式执行。子查询列表,行数据必须满足所有子筛选条件才返回。与 MustQueries 的区别在于:FilterQueries 不计算相关性得分,仅做是否匹配的判断,适用于精确匹配、范围查询和数值条件等场景。

ShouldQueries

逻辑 OR 运算符。子查询列表,行数据至少满足最小匹配个数的子查询条件才返回。满足的子查询条件越多,相关性得分越高。若未设置 MustQueries、MustNotQueries 或 FilterQueries,则默认至少满足 1 个子查询条件;若同时设置了上述条件,ShouldQueries 默认最小匹配个数为 0,仅作为相关性加分项。可通过 MinimumShouldMatch 显式设置最小匹配个数。

MinimumShouldMatch

ShouldQueries 子查询条件的最小匹配个数。仅设置 ShouldQueries 时默认值为 1;同时设置 MustQueries、MustNotQueries 或 FilterQueries 时默认值为 0。

示例

以下示例展示两种常见的 BoolQuery 用法:第一个使用 MustQueries 要求所有条件同时满足(AND),第二个使用 ShouldQueries 要求至少满足其中一个条件(OR)。

/**
 * 通过BoolQuery进行多条件组合查询。
 */
func BoolQuery(client *tablestore.TableStoreClient, tableName string, indexName string) {
    searchRequest := &tablestore.SearchRequest{}
    searchRequest.SetTableName(tableName)
    searchRequest.SetIndexName(indexName)

    // 查询条件一:范围查询,Col_Long > 3
    rangeQuery := &search.RangeQuery{}
    rangeQuery.FieldName = "Col_Long"
    rangeQuery.GT(3)

    // 查询条件二:匹配查询,Col_Keyword 包含 "hangzhou"
    matchQuery := &search.MatchQuery{}
    matchQuery.FieldName = "Col_Keyword"
    matchQuery.Text = "hangzhou"

    {
        // MustQueries:两个条件必须同时满足(AND)
        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))
    }
    {
        // ShouldQueries:至少满足一个条件(OR)
        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))
    }
}           

常见问题

相关文档