多條件組合查詢

更新時間:
Copy as 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))
    }
}           

常見問題

相關文檔